После тщательного изучения исходного кода, предоставленного agua от mars, я пришел к следующему решению. Первый шаг - получить объект Router
, созданный средой Blazor, и я делаю это, используя CascadingValue
в моем App.razor
:
<Router AppAssembly="@typeof(Program).Assembly" @ref="router">
<Found Context="routeData">
<CascadingValue Value="@router">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
...
</RouteView>
</CascadingValue>
</Found>
<NotFound>
...
</NotFound>
</Router>
@code {
private Router router;
}
Так что теперь на любой странице моего приложения я могу получить объект Router
, используя CascadingParameterAttribute
. Далее следует рефлексия (поскольку многие вещи, которые здесь задействованы, определены как internal
):
public Type Find(Router router, string path) {
var assm = typeof(Router).Assembly;
var routes = typeof(Router).GetProperty("Routes", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(router);
var type = assm.GetTypes().FirstOrDefault(t => t.Name == "RouteContext");
var context = Activator.CreateInstance(type, new[] { path });
routes.GetType().GetMethod("Route", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(routes, new[] { context });
return type.GetProperty("Handler").GetValue(context) as Type;
}
И эта функция достигает именно того, что мне нужно.