如何在C#中将Type类型传入泛型方法GetPage<TViewModel>?
解决泛型方法运行时调用的反射错误问题
嘿,我来帮你搞定这个问题!你遇到的两个错误其实都是泛型方法调用的典型问题,咱们一步步拆解:
为什么直接用var page = Navigator.GetPage<viewModel>()不行?
泛型类型参数<T>需要的是编译时就能确定的类型,而viewModel是你运行时从item.TargetType拿到的类型变量,编译器没法把它当成类型来处理,所以会报“变量被当作类型使用”的错误,这时候反射确实是正确的思路。
反射调用时“Object does not match target type”错误的原因
你写的反射代码里,generic.Invoke(this, null)的第一个参数传错了!这个参数是用来指定调用方法的目标对象的:
- 如果
GetPage是静态方法:静态方法不属于任何实例,所以第一个参数必须传null,而不是this; - 如果
GetPage是实例方法:你需要传入Navigator类的一个实例,而不是当前类的this(除非当前类就是Navigator,但看起来不是)。
正确的反射调用代码
情况1:GetPage是静态方法
// 获取无参数的GetPage泛型方法定义 MethodInfo method = typeof(Navigator).GetMethod("GetPage", Type.EmptyTypes); // 传入运行时获取的viewModel类型,构造泛型方法 MethodInfo genericMethod = method.MakeGenericMethod(viewModel); // 静态方法调用,第一个参数传null,获取返回的Page对象 Page page = (Page)genericMethod.Invoke(null, null);
情况2:GetPage是实例方法
如果GetPage需要依赖Navigator的实例,那你得先拿到这个实例再调用:
// 假设你已经有一个Navigator的实例 Navigator navigatorInstance = new Navigator(); // 或者从其他地方获取 // 获取方法定义 MethodInfo method = typeof(Navigator).GetMethod("GetPage", Type.EmptyTypes); MethodInfo genericMethod = method.MakeGenericMethod(viewModel); // 传入Navigator实例作为调用目标 Page page = (Page)genericMethod.Invoke(navigatorInstance, null);
额外注意点
- 确保
GetMethod获取的是正确的重载:如果Navigator里有多个同名的GetPage方法,一定要通过Type.EmptyTypes指定无参数的那个,避免拿到错误的方法重载; - 别忘了类型转换:
Invoke返回的是object类型,需要强制转换成Page才能正常使用。
内容的提问来源于stack exchange,提问作者Bad Dub
相关产品推荐
相关产品推荐

