2011-03-06 102 views
1

我的类是;如何从对象类型获得泛型类型

class BaseClass 
{ 

} 

class DerivedClass1 : BaseClass 
{ 

} 

class GenericClass<T> 
{ 

} 

class DerivedClass2 : BaseClass 
{ 
    GenericClass<DerivedClass1> subItem; 
} 

我想访问DerivedClass2类的所有字段。 我使用System.Reflection和FieldInfo.GetValue()方法;

Bu我不能得到subItem字段。 FieldInfo.GetValue()方法的返回类型是“object”。 而我不能投到GenericClass<DerivedClass1> 或 我不能得到DerivedClass1类型。 我尝试这与BaseClass的

BaseClass instance = FieldInfo.Getvalue(this) as GenericClass<BaseClass>; 

但实例为null。 如何获得类型的实例或如何获得唯一类型?

回答

2

我不知道你想达到什么,但他的作品对我来说:

var foo = new DerivedClass2(); 
var result = typeof(DerivedClass2).GetField("subItem", 
              BindingFlags.NonPublic | 
              BindingFlags.Instance) 
            .GetValue(foo); 
var genericClassField = result as GenericClass<DerivedClass1>; 

genericClassFieldGenericClass<DerivedClass1>型的 - 当然你必须在这之前,它分配一个值,否则结果将null,为了这个,我添加了一个构造函数,你DerivedClass2,不只是说:

class DerivedClass2 : BaseClass 
{ 
    GenericClass<DerivedClass1> subItem; 

    public DerivedClass2() 
    { 
     subItem = new GenericClass<DerivedClass1>(); 
    } 
} 

编辑:

,找出result在运行时,你可以做以下类型:

var foo = new DerivedClass2(); 
var result = typeof(DerivedClass2).GetField("subItem", 
              BindingFlags.NonPublic | 
              BindingFlags.Instance) 
            .GetValue(foo); 
Type myType = result.GetType().GetGenericArguments()[0]; 

在这个例子中,这将返回类型DerivedClass1。我认为这个msdn article可能是相关的。

+0

感谢您的回答。但我的问题是我不知道DerivedClass1类型。它是通用的。从DBObject派生类的所有类都可用。 – Murat 2011-03-06 16:57:26

+0

@穆拉特:看我的编辑 - 你在找什么? – BrokenGlass 2011-03-06 17:15:50

+0

感谢BrokenGlass, 我用不同的方式解决了它。我为GenericClass编写了一个基类,GenericClass的所有字段都在这个基类中。 所以我可以使用所有这些。 – Murat 2011-03-06 17:27:01