从属性而不是名称获取PropertyInfo

时间:2010-06-08 12:51:32

标签: c# reflection

比如说,我有这个简单的课程:

public class MyClass
{
  public String MyProperty { get; set; }
}

获取MyProperty的PropertyInfo的方法是:

typeof(MyClass).GetProperty("MyProperty");

这很糟糕!

为什么呢?简单:一旦我更改了属性的名称就会中断,它需要大量专门的测试才能找到像这样使用属性的每个位置,重构和使用树无法找到这些类型的访问。

有没有办法正确访问房产?在编译时验证的东西?
我喜欢这样的命令:

propertyof(MyClass.MyProperty);

3 个答案:

答案 0 :(得分:6)

目前最接近的是使用表达式树:

GetProperty<MyClass>(x => x.MyProperty)

然后在PropertyInfo(你必须写的)中吮吸GetProperty。但是,这有点脆弱 - 没有编译时保证表达式树只是属性访问。

另一种方法是保留您正在使用的属性名称,可以轻松进行单元测试,并依赖于此。

基本上你想要的是神秘的infoof运算符,C#团队多次讨论过这个运算符 - 但到目前为止还没有进行过这样的运算:(

答案 1 :(得分:1)

自此问题发布以来,C#6已与nameof operator一起发布。这允许使用以下

访问属性
PropertyInfo myPropertyInfo = typeof(MyClass).GetProperty(nameof(MyClass.MyProperty));

如果重命名该属性,则此代码将无法编译(实际上它将会,因为如果正确完成重命名,重命名将更改此行代码。)

答案 2 :(得分:-1)

反思的全部意义是能够在运行时访问内容。如果我们假设您的运算符可以工作,那么您已经拥有了类信息,因此也拥有了属性,使整个事情变得毫无用处。