【问题标题】:Get PropertyInfo from property instead of name从属性而不是名称获取 PropertyInfo
【发布时间】:2017-09-14 11:50:04
【问题描述】:

比如说,我有一个简单的类:

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

获取 MyProperty 的 PropertyInfo 的方法是:

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

这太糟糕了!

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

没有任何方法可以正确访问属性吗?在编译时验证的东西?
我喜欢这样的命令:

propertyof(MyClass.MyProperty);

【问题讨论】:

  • 情况变得更糟了。如果您查看 WPF,您会注意到它需要字符串属性名称来进行数据绑定以及实现 INotifyPropertyChanged 时。对于 Reflection 的用户来说,这现在不是一个极端案例,而是一般的日常用例。我目前依靠 Resharper 来帮助保持同步。
  • Unitesting 在这里帮助了我很多,但仅此而已......
  • 相关堆栈溢出问题及更详细答案:stackoverflow.com/questions/491429/…
  • 你可以在c#6中使用'typeof(MyClass).GetProperty(nameof(MyProperty);'

标签: c# reflection


【解决方案1】:

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

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

然后将PropertyInfo 吸出GetProperty(你必须写)。然而,这有点脆弱 - 没有编译时保证表达式树只是一个属性访问。

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

基本上你想要的是神秘的infoof 运算符,C# 团队已经多次讨论过它——但到目前为止还没有成功:(

【讨论】:

  • 看起来很有趣 - 但我将如何编写 GetProperty?我什至不确定它是 什么 - 一个通用类?还是只是一个通用方法? infoof 听起来不错,可惜它还没有出现。
【解决方案2】:

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

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

如果你重命名属性,这段代码将不会编译(实际上它会编译,因为如果重命名正确,重命名也会改变这行代码)。

【讨论】:

    【解决方案3】:

    反射的全部意义在于能够在运行时访问内容。如果我们假设您的操作员可以工作,那么您已经拥有类信息和属性,从而使整个事情完全无用。

    【讨论】:

    • 我已经拥有房产了?没有文字中的名字?怎么样??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2017-12-05
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多