Как получить универсальный тип из типа объекта - PullRequest
1 голос
/ 06 марта 2011

Мои классы;

class BaseClass
{

}

class DerivedClass1 : BaseClass
{

}

class GenericClass<T>
{

}

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

Я хочу получить доступ ко всем полям класса DerivedClass2. Я использую метод System.Reflection и FieldInfo.GetValue ();

Но я не могу получить поле подэлемента. Тип возврата метода FieldInfo.GetValue () - «объект». И я не могу привести к GenericClass<DerivedClass1> или же Я не могу получить тип DerivedClass1. Я пытаюсь это с BaseClass

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

но экземпляр равен нулю. Как получить экземпляр с типом или как получить только тип?

1 Ответ

2 голосов
/ 06 марта 2011

Я не уверен, чего именно вы хотите достичь, но его работы для меня:

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

genericClassField имеет тип GenericClass<DerivedClass1> - конечно, вы должны присвоить ему значение, прежде чем делать это, иначе результат будет null, для этого я добавил конструктор к вашему DerivedClass2, который делает именно это:

class DerivedClass2 : BaseClass
{
    GenericClass<DerivedClass1> subItem;

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

Edit:

Чтобы узнать тип 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 может быть актуальной.

...