2015-01-08 13 views
7

Vorrei utilizzare il seguente C# 6 CodiceCome gestire nameof (questa) per segnalare il nome della classe

var joe = new Self(); 
Console.WriteLine(joe); 

... e ottenere il seguente risultato:

joe

Il seguente tentativo

class Self { 
    public string Name { get; set; } = nameof(this); 
    public override string ToString() { 
    return Name; 
    } 
} 

fallisce come nameof non può essere applicato a this. C'è una soluzione per questo problema?

MODIFICA. Lo scenario con cui sto lavorando assicura che nessun riferimento rimandi allo stesso oggetto Self.

+4

Io non la penso così. Si consideri 'var joe = new Self(); var jack = joe; '. Dovrebbe 'Name' restituire' "joe" ',' "jack" ', o entrambi? –

+1

Cosa c'è di sbagliato in 'nameof (joe)' – i3arnon

+0

Puoi imparare alcuni usi di nameof (..) da questo post: http: //www.spicelogic.com/Journal/C-sharp-6-most-exciting-features-9 –

risposta

6

Si può semplicemente utilizzare nameof sulla variabile stessa:

Console.WriteLine(nameof(joe)); 

Here 'un esempio di lavoro utilizzando la versione corrente di Roslyn

13

No, nameof è stato progettato per fare riferimento al nome in fase di compilazione della membro a cui ti riferisci. Se vuoi che un oggetto abbia una proprietà Name come parte del suo stato, questo è indipendente dal modo in cui lo ottiene nella proprietà Name - come dice Frédéric Hamidi, potrebbero esserci più variabili (o nessuna) che si riferiscono allo stesso oggetto. Fondamentalmente è necessario distinguere tra un oggetto e una variabile che si riferisce a quell'oggetto.

Tuttavia, se si dispone di un costruttore per specificare il nome, è quindi possibile utilizzare un paio di trucchi per rendere più facile per ottenere il nome giusto:

class Self 
{ 
    public string Name { get; } 

    public Self([CallerMemberName] string name = null) 
    { 
     this.Name = name; 
    } 
} 

Poi:

class Foo 
{ 
    private Self me = new Self(); // Equivalent to new Self("me") 

    public void SomeMethod() 
    { 
     // Can't use the default here, as it would be "SomeMethod". 
     // But we can use nameof... 
     var joe = new Self(nameof(joe)); 
    } 
} 
0

L'idea di nameof consiste nel rendere le cose sicure per la specifica degli elementi del programma durante il runtime, ma con il controllo della sicurezza del tipo a tempo compilato.

Uno dovrebbe atomize quello che si desidera visualizzare. Per esempio nei miei messaggi di errore includo le informazioni pertinenti del nome della classe e il metodo in quanto tale e la sua controllata, quindi se cambio uno dei nomi che sono catturati da un errore di compilazione:

class Operation 
{ 
    public void Execute() 
    { 
    try { ... } 
    catch (Exception ex) 
    { 
    Console.Writeline($"{nameof(Operation)}.{nameof(Execute)} has encountered exception:{Environment.NewLine}{Environment.NewLine}{ex.Message}"); 
    } 
    } 
} 

uscita

Operation.Excecute has exception: 
... 

detto questo si dovrebbe ignorare ToString() e riportare il nome della classe in quanto tale

public override string ToString() { return nameof(Self); } 
Problemi correlati