Отражение: разные способы получения значения свойства - PullRequest
5 голосов
/ 03 марта 2010

Я получаю список свойств IEnumerable с помощью следующего кода:

BindingFlags bindingFlag = BindingFlags.Instance | BindingFlags.Public;  
var dataProperties = typeof(myParentObject).GetProperties(bindingFlag);

Затем я перебираю список и получаю значение для каждого свойства.

Я натолкнулся на два разных подхода к этому и просто удивился, в чем разница между ними:

1)

object propertyValue = property.GetGetMethod().Invoke(myObject, null);

2)

object propertValue = property.GetValue(myObject, null)

1 Ответ

4 голосов
/ 03 апреля 2010

На самом деле, нет никакой разницы.Вы можете увидеть реализацию GetValue с использованием Отражатель :

public override object GetValue(object obj, BindingFlags invokeAttr,
                                Binder binder, object[] index,
                                CultureInfo culture)
{
    MethodInfo getMethod = this.GetGetMethod(true);
    if (getMethod == null)
    {
        throw new ArgumentException(
                             Environment.GetResourceString("Arg_GetMethNotFnd"));
    }
    return getMethod.Invoke(obj, invokeAttr, binder, index, null);
}

Фактический тип здесь RuntimePropertyInfo (PropertyInfo - это абстрактный класс, который не обеспечивает реализацию для GetValue ).

...