使用在运行时确定的类型参数调用泛型函数

时间:2009-09-21 18:14:28

标签: c# generics reflection dynamic runtime

我有一个问题,涉及使用在运行时已知的类型参数调用类的泛型方法。

具体来说,代码如下:


FieldInfo[] dataFields = this.GetType().GetFields( BindingFlags.Public | BindingFlags.Instance );

// data is just a byte array used internally in DataStream
DataStream ds = new DataStream( data );

foreach ( FieldInfo field in dataFields )
{
    Type fieldType = field.FieldType;

    // I want to call this method and pass in the type parameter specified by the field's type
    object objData = ( object ) ds.Read<fieldType>();
}

Read()函数如下所示:


public T Read() where T : struct

此函数的目的是返回从字节数组中读取的数据。

有没有办法在运行时调用泛型方法?

3 个答案:

答案 0 :(得分:12)

处理此问题的最简单方法是使用单个Type参数进行Read函数的非泛型重载:

public object Read(Type t)

然后让通用版本调用非泛型版本:

public T Read<T>() where T : struct
{
    return (T)Read(typeof(T))
}

答案 1 :(得分:7)

您需要构建一个methodinfo并调用Read方法:

MethodInfo method = typeof(DataStream).GetMethod("Read");
MethodInfo generic = method.MakeGenericMethod(fieldType);
object objData = generic.Invoke(ds, null);

答案 2 :(得分:1)

走Lee的路线可能会更好。 Generic是设计时的简写,使您不必为许多不同类型的类编写公共代码。在编译时,对泛型方法或类的每次调用基本上都是作为一个完全独立的类生成的。

更简单的方法就是对类型进行低音并使用反射,这是你不得不做的事情。