Есть ли способ найти фактический класс, в котором определено отраженное поле, или найти общий базовый класс для дочерних объектов? - PullRequest
0 голосов
/ 17 мая 2011

У меня есть поле, определенное в базовом классе, и когда я использую отражение в дочернем объекте, я хочу получить базовый класс, в котором поле фактически определено.Есть ли способ сделать это в C # .Net 4.0?

В качестве альтернативы, есть ли способ динамически найти общий базовый класс, учитывая 2 разных дочерних класса?

Ответы [ 2 ]

0 голосов
/ 17 мая 2011

Чтобы определить, к какому базовому классу принадлежит объект, попробуйте это ..

obj.GetType().DeclaringType;

Чтобы узнать, принадлежат ли два объекта одному базовому типу, вы можете сделать что-то вроде этого.

//haven't compiled the code.. you can get the basic idea. Note that `System.Object` will always be the base class for every .Net Object
bool HaveSameBase(Object a, Object b)
{
    Type t = a.GetType();
    List<Type> aTypeList = new List<Type>();
    while(t.BaseType != System.Object)
        {
        aTypeList.Add(t.BaseType);
        t = t.BaseType;
        }

    Type s = b.GetType();
        while(s.BaseType != System.Object)
        {
        if(aTypeList.Any(item => item.Equals(s.BaseType)
             return true;
        s = s.BaseType;
        }

    return false;

}
0 голосов
/ 17 мая 2011

Свойство FieldInfo.DeclaringType должно указывать на тип, который фактически определяет поле.

Это на самом деле происходит от MemberInfo, поэтому это также будет работать для свойств, методов и т. Д.* По второму вопросу.Это не проверено, но должно работать:

public Type GetSharedBaseType(Type a, Type b)
{
    Type tempA = a;
    Type tempB = b;

    while (tempA != null)
    {
        while (tempB != null)
        {
            if (tempA == tempB)
                return tempA;

            tempB = tempB.BaseType;
        }

        tempA = tempA.BaseType;
        tempB = b;
    }

    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...