如何依据对象类型调用泛型方法?解决编译报错问题
问题描述
我有一个泛型方法:
public T GetObject<T>() { ... }
现有SomeClass类型的对象someObject,该类继承自泛型参数T。我希望依据someObject的类型调用泛型方法,但以下代码无法运行:
Type classType = someObject.GetType(); object ret = GetObject<classType>();
编译器报错:
classType is a variable but it is used like a type.
请问正确的写法是什么?
解决方案
泛型类型参数需要在编译时确定,而classType是运行时才能获取的变量,因此无法直接将其作为泛型参数使用。这种场景需要通过反射来调用泛型方法,具体实现代码如下:
Type classType = someObject.GetType(); // 若GetObject是实例方法,用this.GetType();若是静态方法,替换为方法所属的类类型 MethodInfo method = this.GetType().GetMethod("GetObject"); // 构造对应类型的泛型方法 MethodInfo genericMethod = method.MakeGenericMethod(classType); // 调用方法:实例方法传入this,静态方法传入null object ret = genericMethod.Invoke(this, null);
如果存在方法重载的情况,为了精准获取目标方法,可以指定参数类型(由于GetObject是无参方法,传入空类型数组即可):
MethodInfo method = this.GetType().GetMethod("GetObject", Type.EmptyTypes);
内容的提问来源于stack exchange,提问作者Amos Egel
相关产品推荐
相关产品推荐

