我试图以一种动态的方式允许在 Caliburn.Micro 中进行一些导航(在设计时不会知道视图模型)。
这段代码显然有效
navigationService.UriFor<DatabasesViewModel>().Navigate();
但是,根据我正在尝试做的事情,我不会提前知道视图模型。相反,我将只有视图模型的类型。
我一直在尝试使用反射来获取泛型方法,但我能够通过 GetMethod 或 GetMethods 获取 UriFor 方法。任何想法如何实现这一点。
我试图以一种动态的方式允许在 Caliburn.Micro 中进行一些导航(在设计时不会知道视图模型)。
这段代码显然有效
navigationService.UriFor<DatabasesViewModel>().Navigate();
但是,根据我正在尝试做的事情,我不会提前知道视图模型。相反,我将只有视图模型的类型。
我一直在尝试使用反射来获取泛型方法,但我能够通过 GetMethod 或 GetMethods 获取 UriFor 方法。任何想法如何实现这一点。
您的问题与 Caliburn.Micro 没有直接关系,而是如何在 C# 中使用反射调用泛型方法。
在 SO 上已经有很多非常好的问题: 如何使用反射调用泛型方法?
但是,您的情况有点特殊,因为Caliburn 在类UriFor<T>
中定义为扩展方法的方法NavigationExtensions
因此,您需要一些额外的步骤并从NavigationExtensions
类型开始,然后才能调用Navigate
:
//Create the UriFor Method for your ViewModelType
var navigationExtension = typeof(NavigationExtensions);
var uriFor = navigationExtension.GetMethod("UriFor");
var genericUriFor = uriFor.MakeGenericMethod(yourViewModelType);
//Invoke UriFor: an instance of UriBuilder<T> is returned
var uriBuilder = genericUriFor.Invoke(null, new[] {navigationService});
//Create and Navigate on the returned uriBuilder
var navigateMethod = uriBuilder.GetType().GetMethod("Navigate");
navigateMethod.Invoke(uriBuilder, null);