2015-05-07 23 views
6

Il nuovo C# 6.0 nameof è grande nel modello PropertyChanged per propagare le modifiche alle proprietà utilizzando qualcosa di simile:È possibile utilizzare un nome di espressione nell'istruzione switch?

private string _myProperty; 

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

Durante l'ascolto delle modifiche alle proprietà che uso questo (sì, anche con le stringhe hardcoded brutto):

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

Con il nuovo nome di espressioni questo codice verrà compilato/lavorato?

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

Non penso che 'nameof (MyObject.MyProperty)' funzioni. 'MyProperty' non è statico. Avresti bisogno di un'istanza di 'MyObject'. –

+4

Lo è. Il * nome della proprietà * è sempre statico @ FrédéricHamidi –

risposta

13

Secondo this question, la valutazione della parola chiave nameof è fatto in fase di compilazione. Questo lo renderà una costante, che funzionerà all'interno delle dichiarazioni switch.

Ciò è dimostrato quando si guarda alla compiled output di questo codice:

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

    } 
} 

uscita:

Sì!

+1

Questo non risponde ancora se funziona anche con membri non statici e, forse ancora più importanti, con proprietà. La sintassi per l'identificazione di metodi come "Program.Main" era già esistente, ad esempio, per identificare il metodo passato ai gestori di eventi. Tuttavia, qualcosa come "Program.SomeProperty' è possibile? (Basato su una leggera estensione del tuo Fiddle, sembra che lo sia, ma penso che dovrebbe essere aggiunto come proprietà sono ciò che è stato chiesto.) –

+0

È una costante, certo che può. Vedi [qui] (https://dotnetfiddle.net/08SxoQ). –

+0

Sono diventato attento con "dei corsi"; anche la firma di un particolare metodo di overload è una costante, eppure, non esiste una sintassi C# per esprimerla, [che è una delle ragioni principali per cui stiamo ricevendo 'nameof' invece di un operatore' infoof'] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue.aspx). –