在C#中引用属性本身。 reflection? 通用? 类型?

如果这个问题没有很好地制定,请耐心等待。 不知道是问题的一部分。

我想要完成的一个例子可以在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* 

到目前为止,我正在画一个空白。

不幸的是,没有一种直接的方法可以做到这一点; 但是,您可以通过Expression在.NET 3.5中执行此操作。 请看这里了解更多。 要复制示例:

 PropertyInfo prop = PropertyHelper.GetProperty(x => x.Bar); 

(更改它以返回名称而不是PropertyInfo非常简单)。

同样,编写变体会非常简单:

 OnPropertyChanged(x=>x.Name); 

使用:

 OnPropertyChanged(Expression> property) {...} 

这是一个经常被请求的function,通常称为infoof(“info of”),它将返回与成员关联的reflection对象,例如

 PropertyInfo pi = infoof(Person.Name); 

遗憾的是,动态关键字正在吸收C#编译器团队的时间!

我非常有信心没有办法避免指定一个字符串 – 据我所知,C#或.NET中没有内置函数可以传递对属性的引用,并且将string传递给Reflection API是远远不够的是最简单的方法。

但是,在标准.NET之外,您可能会在PostSharp (面向方面​​的.NET编程)中找到您的解决方案,它允许您添加代码,以便在各种属性更改时自动引发事件,如您在问题中所示。