使用运行时类型和强制转换对象调用Generic方法

时间:2010-12-31 13:49:33

标签: c# generics

我正在使用反射来调用在运行时确定的类型的泛型方法。我的代码如下:

Type tType = Type.GetType(pLoadOut.Type);
MethodInfo method = typeof(ApiSerialiseHelper).GetMethod("Deserialise", new Type[] { typeof(string) });
MethodInfo generic = method.MakeGenericMethod(tType);
generic.Invoke(obj, new object[] { pLoadOut.Data });

这没关系。但是generic.Invoke方法返回一个对象,但我想要的是在运行时确定的类型。这种方法可以实现,还是有更好的选择?

标记

2 个答案:

答案 0 :(得分:5)

在运行时确定类型IS。它是作为对象的引用变量的类型,实际的实例是强类型的。

这是最好的,考虑到您使用反射动态访问编译器没有类型信息的方法 - 它甚至可能不存在于构建环境中。

编辑:如果您对Deserialize返回的类型有所了解,那么您可以利用委托差异。例如:

Type tType = Type.GetType(pLoadOut.Type);
MethodInfo method = typeof(ApiSerialiseHelper).GetMethod("Deserialise", new Type[] { typeof(string) });
MethodInfo generic = method.MakeGenericMethod(tType);
Converter<string,ISomething> deser = (Converter<string,ISomething>)Delegate.CreateDelegate(typeof(Converter<string,ISomething>),generic);
ISomething result = deser(pLoadOut.Data);

答案 1 :(得分:0)

如果返回的对象具有共同的祖先或接口,则可以转换为它们。如果他们不这样做,那么他们应该,例如,如果所有可能的返回类型都有一个名为DoSomething()的方法,那么创建一个具有方法DoSomething()的接口。

相关问题