【问题标题】:Is it possible to use an nameof expression in switch statement?是否可以在 switch 语句中使用 nameof 表达式?
【发布时间】:2015-07-17 19:51:43
【问题描述】:

新的C# 6.0 nameof 在PropertyChanged 模式中非常棒,可以使用以下方式传播属性更改:

private string _myProperty;

public string MyProperty
{
    get
    {
        return _myProperty;
    }
    set
    {
        _myProperty= value;
        OnPropertyChanged(nameof(MyProperty));
    }
}

当监听属性更改时,我使用这个(是的,即使是丑陋的硬编码字符串):

    private void OnMyObjectPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        switch (args.PropertyName)
        {
            case "MyProperty":
                DoSomething();
                break;
        }
    }

使用新的 nameof 表达式,这段代码是否可以编译/工作?

private void OnMyObjectPropertyChanged(object sender, PropertyChangedEventArgs args)
{
    switch (args.PropertyName)
    {
        case nameof(MyObject.MyProperty):
            DoSomething();
            break;
    }
}

【问题讨论】:

  • 我认为nameof(MyObject.MyProperty) 不会起作用。 MyProperty 不是静态的。你需要一个MyObject 的实例。
  • 是的。 属性名称始终是静态的 @FrédéricHamidi

标签: c# .net roslyn nameof


【解决方案1】:

根据this question,nameof 关键字的评估是在编译时完成的。这将使它成为一个常量,它将在 switch 语句中起作用。

当您查看此代码的compiled output 时,可以证明这一点:

using System;

public class Program
{
    public string A { get; set; }

    public static void Main()
    {
        string a = "A";

        switch (a)
        {
            case nameof(Program.A):
            {
                Console.WriteLine("Yes!");
                break;
            }
        }

    }
}

输出:

是的!

【讨论】:

  • 这还没有回答它是否也适用于非静态成员,以及 - 也许更重要的是 - 属性。用于识别 Program.Main 等方法的语法已经存在,例如,用于识别传递给事件处理程序的方法。但是,像Program.SomeProperty 这样的东西也可能吗? (基于您的 Fiddle 的轻微扩展,它似乎是,但我认为应该添加它,因为属性是所要求的。)
  • 我对“课程”变得谨慎了;特定方法重载的签名也是一个常量,但是,没有 C# 语法来表达它,which is a major reason why we're just getting nameof instead of an infoof operator。
  • 感谢您的回答!
  • @O.R.Mapper 如果你不相信帕特里克,你可以在这里仔细检查nameof:tryroslyn.azurewebsites.net
  • @O.R.Mapper 好的。明白了。
猜你喜欢
  • 1970-01-01
  • 2014-09-10
  • 2021-11-04
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多