You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:29:49