2015-05-07 25 views
6

C# 6.0 nameof使用类似传播特性的变化是在PropertyChanged模式极大:是否可以在switch语句中使用表达式的名称?

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; 
     } 
    } 

使用新的表达式名称将此代码编译/工作?

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

我不认为'nameof(MyObject.MyProperty)'会起作用。 'MyProperty'不是静态的。你需要一个'MyObject'的实例。 –

+4

它是。 *属性名称*永远是静态的@FrédéricHamidi –

回答

13

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; 
      } 
     } 

    } 
} 

输出:

是的!

+1

这还不能回答它是否也适用于非静态成员,以及 - 也许更重要的是 - 属性。例如,识别诸如“Program.Main”之类的方法的语法已经存在,以识别传递给事件处理程序的方法。然而,类似'Program.SomeProperty'也是可能的吗? (基于你小提琴的略微延伸,它似乎是,但我认为它应该被添加作为属性被要求。) –

+0

这是一个常数,当然它可以。见[这里](https://dotnetfiddle.net/08SxoQ)。 –

+0

我对“课程”非常小心。一个特定方法重载的签名也是一个常量,但是,没有用于表达它的C#语法,[这是我们只是获得'nameof'而不是'infoof'运算符]的主要原因( http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue.aspx)。 –

相关问题