Как я могу получить имя и значение свойства, используя отражение? - PullRequest
3 голосов
/ 02 ноября 2011

У меня есть этот код, и я использую его для вызова события PropertyChanged без передачи имени свойства в функцию.

private void RaisePropertyChanged<TValue>(Expression<Func<TValue>> propertySelector)
    {
        var memberExpression = propertySelector.Body as MemberExpression;
        if (memberExpression != null)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(memberExpression.Member.Name));
            }
        }
    }

и я называю это так:

  this.RaisePropertyChanged(() => this.IsReady);

Что вызовет событие PropertyChanged для свойства IsReady. Мне нравится идея, поскольку написание кода таким способом поможет очень легко изменить имя свойства.

Теперь я хочу использовать ту же технику для передачи имени и значения свойства методу. Есть ли способ, которым я могу это сделать?

Ответы [ 2 ]

4 голосов
/ 02 ноября 2011

У вас уже есть это:

string name = memberExpression.Member.Name;
TValue value = propertySelector.Compile()();

В качестве альтернативы можно посмотреть на member.MemberType, приведенное к PropertyInfo или FieldInfo соответственно:

var member = memberExpression.Member;
string name = member.Name;
object value;
switch(member.MemberType) {
    case MemberTypes.Field:
       value = ((FieldInfo)member).GetValue(this);
       break;
    case MemberTypes.Property:
       value = ((PropertyInfo)member).GetValue(this, null);
       break;
    default:
       throw new NotSupportedException(member.MemberType.ToString());
}

Однако более простой подход заключается в том, чтобы просто передать имя и значение методу:

Foo("IsReady", IsReady);

Это зависит от того, насколько эффективнохотя (отражение / выражение добавляет накладные расходы - зависит ли это значимо от контекста).

0 голосов
/ 02 ноября 2011

Для получения имени вы можете использовать memberExpression.Member.Name и для получения значения вы можете использовать this.GetType().GetProperty (memberExpression.Member.Name).GetGetMethod().Invoke (this, null).

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