2009-09-21 87 views
8

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

在具体的代码看起来像这样:


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 

该功能的目的是返回从字节数组中读取数据。

有没有什么办法像这样在运行时调用泛型方法?

回答

12

来处理这将是使读取功能的非泛型重载使用单一类型的参数,最简单的方法:

public object Read(Type t) 

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

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

感谢您的回复,我从来没有考虑过这么简单的设计变更。 – 2009-09-21 18:26:33

+0

我的问题并没有像OP问题那样看起来像,但是你完全证明了我需要知道的东西。谢谢! – KennyZ 2012-05-20 13:39:59

7

你需要建立一个MethodInfo,并调用Read方法:

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

再次感谢里德,您的帮助非常感谢。 – 2009-09-21 18:25:55

1

李的路线可能会更好。 Generic在设计时是速记,可以避免为许多不同类型的类编写通用代码。在编译时,每个对泛型方法或类的调用都基本上是作为一个完全独立的类生成的。

更简单的就是低音的类型和使用反射,这是你将不得不做的反正。

+0

诚然,Lee的方法在性能方面也会更好,因为检索MethodInfo的附加反射是额外的计算,可以用他的方法避免。 – 2009-09-21 18:27:39

相关问题