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

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

具体来说,代码如下所示:

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(); } 

Read()函数如下所示:

 public T Read() where T : struct 

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

有没有办法像运行这样在运行时调用generics方法?

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

 public object Read(Type t) 

然后让通用版本调用非generics版本:

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

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

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

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

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