【问题标题】:C# 6: nameof() current property in getter/setterC# 6:getter/setter 中的 nameof() 当前属性
【发布时间】:2016-03-31 15:39:47
【问题描述】:

有没有办法在 getter/setter 中获取当前属性的名称?

类似这样的:

public string MyProperty
{
    get { return base.Get<string>(nameof(ThisProperty)); }
    set { base.Set<string>(nameof(ThisProperty), value); }
}

nameof(ThisProperty) 应该解析为“MyProperty”。

【问题讨论】:

  • nameof(MyProperty) 应该可以正常工作吗?
  • 为什么要出现?写nameof(MyProperty)有什么问题?
  • 这在MyProperty 名称可能更改的情况下很有用:然后,您必须记住更新nameof(whatever),尽管Visual Studio IDE 应该会发现这个问题。
  • @levelonehuman 是的,IDE 应该抓住这一点,因为这是(afaik)引入nameof 的主要原因之一。
  • 我在使用 MVVM 的 RaisePropertyChanged(nameof(ThisProperty)) 方法并尝试在生成新属性时避免剪切和粘贴问题时遇到了这个问题。然后我更仔细地查看了 MVVMLight 的方法签名,发现它们已经为 RaisePropertyChanged() 定义为 public virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null); 的重载,正是为此目的:-)

标签: c# c#-6.0 nameof


【解决方案1】:

nameof 无法做到这一点,但有一种更好的方法(自 C# 5 起可用)。您可以将propertyName 参数设为可选并将CallerMemberName 属性应用于它:

protected void Set<T>(T value, [CallerMemberName] string propertyName = null)
{
    ...
}

protected T Get<T>([CallerMemberName] string propertyName = null)
{
    ...
}

现在,如果您省略 propertyName 的参数,则将隐式传递当前成员名称:

public string MyProperty
{
    get { return base.Get<string>(); } // same as calling Get<string>("MyProperty")
    set { base.Set<string>(value); } // same as calling Set<string>(value, "MyProperty")
}

【讨论】:

  • 这是一个了不起的答案!谢谢楼主!
  • 我不同意你的第一句话。从 C# 6 开始,nameof 将真正完成这项工作:public string MyProperty { get { return base.Get&lt;string&gt;(nameof(MyProperty)); } set { base.Set&lt;string&gt;(nameof(MyProperty), value); } }
  • @takrl,我认为 OP 想要获取属性的名称,而不必明确指定它。如果用nameof(MyProperty),还是要自己写MyProperty(诚然,还是比写成字符串好)
  • 我同意在这种情况下使用[CallerMemberName] 可能会更好,但是,第一句话似乎暗示 nameof 不适用于属性,这是不正确的。
  • 难道不应该是:“[CallerMemberName] string propertyName = null”?
【解决方案2】:

替代方法是 MethodBase,因为 Get 和 Set 本质上是方法。

public string MyProperty
{
    get
    {
        return MethodBase.GetCurrentMethod().Name.Substring(4);
    }            
}

子字符串存在是因为每个名称都以 get_ 和 set_ 为前缀

这将返回 MyProperty 作为结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多