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

时间:2009-05-12 23:09:43

标签: c# reflection properties

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

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

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

3 个答案:

答案 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编程)中找到您的解决方案,它允许您添加代码,以便在各种属性更改时自动引发事件,如您所示你的问题。