2011-03-06 104 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