比如说,我有这个简单的课程:
public class MyClass
{
public String MyProperty { get; set; }
}
获取MyProperty的PropertyInfo的方法是:
typeof(MyClass).GetProperty("MyProperty");
这很糟糕!
为什么呢?简单:一旦我更改了属性的名称就会中断,它需要大量专门的测试才能找到像这样使用属性的每个位置,重构和使用树无法找到这些类型的访问。
有没有办法正确访问房产?在编译时验证的东西?
我喜欢这样的命令:
propertyof(MyClass.MyProperty);
答案 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)
反思的全部意义是能够在运行时访问内容。如果我们假设您的运算符可以工作,那么您已经拥有了类信息,因此也拥有了属性,使整个事情变得毫无用处。