2015-05-07 29 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)。 –

相關問題