如何将Type对象用作Type参数?
例如:
byte[] Data;
Type objectType;
public T MyFunction<T>()
{
return OtherClass.Deserialize <objectType> (Data);
}
换句话说,如何在Type参数<typehere>
中使用Type对象?
答案 0 :(得分:1)
您的通用方法需要类型标识符,编译时。同时,您尝试将此类型的实例传递给您的方法,但直到运行时才知道这样的实例。
改为使用反射:
var method = typeof (OtherClass).GetMethods()
.Single(x => "Deserialize".Equals(x.Name)
&& x.IsGenericMethodDefinition);
method = method.MakeGenericMethod(new[] { objectType });
method.Invoke(null, new object[] { Data });
答案 1 :(得分:0)
像这样(递归地,为了简洁起见):
Type myType;
public void MyFunction<T>(T instance) {
MyFunction<Type>(myType);
}
答案 2 :(得分:0)
此处myType
是Type
个对象。所以你应该致电MyFunction<Type>( myType);
答案 3 :(得分:0)
您应该编写MyFunction方法,如:
public T MyFunction<T>(byte[] data)
{
return OtherClass.Deserialize<T>(data);
}
,客户端代码如下所示:
byte[] Data = new byte[];
Type objectType;
objectType = MyFunction<Type>(Data);
答案 4 :(得分:0)
泛型真的被设计用于在调用端编译时已知的类型。 (当然,就调用者而言,类型参数本身可以是一个类型参数。)
否则,您仍然坚持使用泛型 - 您将MethodInfo
与OtherClass.Deserialize
相关联,使用objectType
作为参数调用MakeGenericMethod
,然后调用结果方法。
var method = typeof(OtherClass).GetMethod("Deserialize");
var genericMethod = method.MakeGenericMethod(objectType);
object result = genericMethod.Invoke(null, Data);
请注意,这不会返回T
。如果你实际上不打算使用type参数,那么为什么你的MyFunction
方法是通用的还不清楚。