c#将对象键入Type参数

时间:2013-04-25 05:16:54

标签: c# types

如何将Type对象用作Type参数?

例如:

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

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

5 个答案:

答案 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)

此处myTypeType个对象。所以你应该致电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)

泛型真的被设计用于在调用端编译时已知的类型。 (当然,就调用者而言,类型参数本身可以是一个类型参数。)

否则,您仍然坚持使用泛型 - 您将MethodInfoOtherClass.Deserialize相关联,使用objectType作为参数调用MakeGenericMethod,然后调用结果方法。

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

请注意,这不会返回T。如果你实际上不打算使用type参数,那么为什么你的MyFunction方法是通用的还不清楚。