c#类型对象到类型参数

c#类型对象到类型参数,c#,types,C#,Types,如何使用类型对象作为类型参数 例如: byte[] Data; Type objectType; public T MyFunction<T>() { return OtherClass.Deserialize <objectType> (Data); } byte[]数据; 类型objectType; 公共T MyFunction() { 返回OtherClass.Deserialize(数据); } 换句话说,如何在类型参数?中使用类型对象,如下所示(为

如何使用类型对象作为类型参数

例如:

byte[] Data;
Type objectType;
public T MyFunction<T>()
{
     return OtherClass.Deserialize <objectType> (Data);
}
byte[]数据;
类型objectType;
公共T MyFunction()
{
返回OtherClass.Deserialize(数据);
}
换句话说,如何在类型参数

中使用类型对象,如下所示(为简洁起见,以递归方式):

Type-myType;
public void MyFunction(T实例){
MyFunction(myType);
}

这里
myType
是一个
Type
对象。所以你应该调用
MyFunction(myType)

您应该编写MyFunction方法,如下所示:

public T MyFunction<T>(byte[] data)
{
     return OtherClass.Deserialize<T>(data);
}
public myt函数(字节[]数据)
{
返回OtherClass.Deserialize(数据);
}
客户端代码如下所示:

byte[] Data = new byte[];
Type objectType;
objectType = MyFunction<Type>(Data);
byte[]数据=新字节[];
类型objectType;
objectType=MyFunction(数据);

泛型方法需要编译时已知的类型标识符。同时,您试图将这种类型的实例传递给您的方法,但直到运行时才知道这种实例

改用反射:

var method = typeof (OtherClass).GetMethods()
                                .Single(x => "Deserialize".Equals(x.Name) 
                                              && x.IsGenericMethodDefinition);
method = method.MakeGenericMethod(new[] { objectType });
method.Invoke(null, new object[] { Data });

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

否则,您就只能使用泛型-您将获得与
其他类关联的
MethodInfo
。反序列化
,使用
objectType
作为参数调用,然后调用生成的方法

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

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

尝试将类型存储在变量@Facioratio中,而不是将类型存储在变量@Facioratio中。也看到这不完全起作用,我需要返回一个t类型,不是类型对象。你到底想做什么?从
对象
对象中获取myType类型的对象,抱歉,这里很难弄清楚。不太清楚你要说什么?是的,但结果是类型对象,这绝对没有用,我需要一个objectType类型的对象..啊,我现在明白你在问什么了。泛型不适用于运行时确定的类型,它们旨在提供类型安全性,而这不是在运行时确定类型所得到的。尝试提取一些通用接口,并将其与通用方法一起使用。您建议如何执行?也许我不清楚,我想真正的问题是如何将对象强制转换为存储在类型变量中的类型?
var method = typeof(OtherClass).GetMethod("Deserialize");
var genericMethod = method.MakeGenericMethod(objectType);
object result = genericMethod.Invoke(null, Data);