![](/img/trans.png)
[英]How can I Get the property by name from type and Set Propert value using reflection in C#
[英]How can I get the name and value of a property using reflection?
我有这个代码,我用它来引发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);
这将引发IsReady属性的PropertyChanged事件。 我喜欢这个想法,因为以这种方式编写代码将有助于非常容易地更改属性的名称。
现在我想使用相同的技术将属性的名称和值传递给方法。 有什么方法可以做到这一点吗?
你已经拥有它:
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);
它取决于它需要多高的效率,但是(反射/表达确实增加了开销 - 这是否重要取决于上下文)。
要获取名称,您可以使用memberExpression.Member.Name
并获取值,您可以使用this.GetType().GetProperty (memberExpression.Member.Name).GetGetMethod().Invoke (this, null)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.