我有一个泛型类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不确定的情况下,正确的写法应该是怎么样的?

解决方案 »

  1.   

    这个确实是个问题,各个泛型类之间实际上是完全没有关系的。
    可以完全通过反射来调用,但是性能成问题。
    比较好的做法是写一个A<T>类的非泛型的接口IA,然后class A<T> : IA,然后用IA做为fi.GetValue(obj)的返回类型。参考.Net里集合类的写法,IEnumable<T>和IEnumable,IList<T>和IList等等。
      

  2.   

    to danjiewu:
      能使用接口的话,问题自然就不存在了   :)  不过我还是想知道,如果受限于某些因素,没法使用接口,这个问题还有没有比较优雅的答案。to Jinglecat:
      非泛型,当然可以这样用啊。A a = fi.GetValue(obj) as A,有问题吗?
      

  3.   

    对于一个动态生成的类型,又没有实现接口或继承基类的话,确实没有什么办法,只能用反射。
    要么你的类型是编译时确定的,fi.GetValue(obj)是在泛型方法或者类内,就可以的。
      

  4.   

    to iamtruemanA a = fi.GetValue(obj) as A ????服你了,你自己都说fi是一个FieldInfo了,那么fi.GetValue(obj)就可以as A了?
      

  5.   

    A a = fi.GetValue(obj) as A 有问题吗?
    真奇怪。
      

  6.   

    to danjiewu:
      就是,不知道他们为什么觉得有问题。anyway,结帖,给分~