我有一个泛型类A:
public class A<T>{...}假设我已经通过反射获得了一个实际上是A类型的FieldInfo(叫做fi吧),但是我又无法获知T是什么。在这种情况下,有没有一种办法,可以通过反射获得A的实例?即类似下面这样的效果:A<> a = fi.GetValue(obj) as A<>;
或者
A<> a = (A<>)fi.GetValue(obj);当然,上面两条语句都是错的,不能通过编译,原因是没有提供T。那么在T不确定的情况下,正确的写法应该是怎么样的?
public class A<T>{...}假设我已经通过反射获得了一个实际上是A类型的FieldInfo(叫做fi吧),但是我又无法获知T是什么。在这种情况下,有没有一种办法,可以通过反射获得A的实例?即类似下面这样的效果:A<> a = fi.GetValue(obj) as A<>;
或者
A<> a = (A<>)fi.GetValue(obj);当然,上面两条语句都是错的,不能通过编译,原因是没有提供T。那么在T不确定的情况下,正确的写法应该是怎么样的?
可以完全通过反射来调用,但是性能成问题。
比较好的做法是写一个A<T>类的非泛型的接口IA,然后class A<T> : IA,然后用IA做为fi.GetValue(obj)的返回类型。参考.Net里集合类的写法,IEnumable<T>和IEnumable,IList<T>和IList等等。
能使用接口的话,问题自然就不存在了 :) 不过我还是想知道,如果受限于某些因素,没法使用接口,这个问题还有没有比较优雅的答案。to Jinglecat:
非泛型,当然可以这样用啊。A a = fi.GetValue(obj) as A,有问题吗?
要么你的类型是编译时确定的,fi.GetValue(obj)是在泛型方法或者类内,就可以的。
真奇怪。
就是,不知道他们为什么觉得有问题。anyway,结帖,给分~