0

如何使用 Type 对象作为 Type 参数?

例如:

byte[] Data;
Type objectType;
public T MyFunction<T>()
{
     return OtherClass.Deserialize <objectType> (Data);
}

换句话说,如何在 Type 参数中使用 Type 对象<typehere>

4

5 回答 5

1

您的通用方法需要在编译时已知的类型标识符。同时,您正在尝试将此类类型的实例传递给您的方法,但直到runtime才知道此类实例。

改用反射:

var method = typeof (OtherClass).GetMethods()
                                .Single(x => "Deserialize".Equals(x.Name) 
                                              && x.IsGenericMethodDefinition);
method = method.MakeGenericMethod(new[] { objectType });
method.Invoke(null, new object[] { Data });
于 2013-04-25T05:47:41.550 回答
0

您应该编写 MyFunction 方法,例如:

public T MyFunction<T>(byte[] data)
{
     return OtherClass.Deserialize<T>(data);
}

客户端代码如下所示:

byte[] Data = new byte[];
Type objectType;
objectType = MyFunction<Type>(Data);
于 2013-04-25T05:36:07.290 回答
0

像这样(递归,为简洁起见):

Type myType;
public void MyFunction<T>(T instance) {
  MyFunction<Type>(myType);
}
于 2013-04-25T05:21:54.563 回答
0

myType是一个Type对象。所以你应该打电话MyFunction<Type>( myType);

于 2013-04-25T05:21:57.953 回答
0

泛型实际上是为使用在调用端编译时已知的类型而设计的。(当然,就调用者而言,类型参数本身可以是类型参数。)

否则,你会被泛型困住——你会得到MethodInfo关联的 with OtherClass.Deserialize,调用MakeGenericMethodusingobjectType作为参数,然后调用结果方法。

var method = typeof(OtherClass).GetMethod("Deserialize");
var genericMethod = method.MakeGenericMethod(objectType);
object result = genericMethod.Invoke(null, Data);

请注意,这不会返回TMyFunction如果您实际上不打算使用类型参数,则不清楚为什么您的方法是通用的。

于 2013-04-25T05:51:54.937 回答