如果这个问题没有很好地制定,请耐心等待。不知道是问题的一部分。
我想要完成的一个例子可以在WPF中的PropertyChangedEventArgs中找到。如果要在WPF中标记属性已更改,请执行以下操作:
PropertyChanged(this, new PropertyChangedEventArgs("propertyName"));
您将字符串传递给引用已更改的属性名称的PropertyChangedEventArgs。
你可以想象我真的不想在我的代码中找到属性名称的硬编码字符串。当然,重构重命名错过了它,这使得它不仅在美学上没有吸引力,而且还容易出错。
我更愿意引用属性本身 ......不知何故。
PropertyChanged(this, new PropertyChangedEventArgs(?SomeClass.PropertyName?));
似乎我应该能够用一个简短的方法来包装它,让我说出类似上面的内容。
private void MyPropertyChanged(??) {
PropertyChanged(this, new PropertyChangedEventArgs(??.ToString()??));
}
... so I can say something like:
MyPropertyChanged(Person.Name); //where I'm interested in the property *itself*
到目前为止,我正在画一个空白。
答案 0 :(得分:6)
不幸的是,没有直接的方法可以做到这一点;但是,您可以通过Expression
在.NET 3.5中执行此操作。 See here了解更多信息。要复制示例:
PropertyInfo prop = PropertyHelper<Foo>.GetProperty(x => x.Bar);
(将其更改为返回名称而非PropertyInfo
)非常简单。
同样,编写变体非常简单:
OnPropertyChanged(x=>x.Name);
使用:
OnPropertyChanged<T>(Expression<Func<MyType,T>> property) {...}
答案 1 :(得分:1)
这是一个经常被请求的功能,通常称为infoof(“info of”),它将返回与成员关联的反射对象,例如
PropertyInfo pi = infoof(Person.Name);
可悲的是,动态关键字正在吸收C#编译器团队的时间!
答案 2 :(得分:1)
我非常有信心没有办法避免指定一个字符串 - 根据我所知,C#或.NET中没有内置的功能允许你传递对属性的引用,并传递string
到Reflection API到目前为止是最简单的方法。
但是,在标准.NET之外,您可能会在PostSharp(面向方面的.NET编程)中找到您的解决方案,它允许您添加代码,以便在各种属性更改时自动引发事件,如您所示你的问题。