2016-07-08 21 views
10

Ich möchte regelmäßig den Namen einer Instanzeigenschaft eines Typs abrufen, wenn ich keine Instanz habe. Zur Zeit, dies zu tun, verwende ich die folgende Inhouse-Funktion, die die Expression[Func[T, object]] Parameter interpretiert und gibt den Eigenschaftsnamen:Kann C# nameof operator Referenzinstanzeigenschaft ohne Instanz?

var str = LinqExtensions.NameOf<ClientService>(x => x.EndDate); 
// Now str == "EndDate" 

aber es ist eine Schande scheint nicht in nameof Betreibern gebaut zu verwenden.

Leider scheint der Operator nameof entweder eine Instanz zu benötigen oder eine statische Eigenschaft zu referenzieren.

Gibt es eine saubere Möglichkeit, den Operator nameof anstelle unserer internen Funktion zu verwenden? Zum Beispiel:

nameof(ClientService.EndDate) // ClientService.EndDate not normally syntactically valid as EndDate is instance member 

EDIT

war ich völlig falsch, die Syntax nameof(ClientService.EndDate) als tatsächlich funktioniert beschrieben, wie ist.

+1

Es funktioniert einfach - 'Klasse C {public int P {get; }} '-' nameof (C.P) 'kompiliert gut. –

Antwort

25

Von the documentation:

In den Beispielen sehen Sie, dass Sie einen Typnamen verwenden können, und eine Instanz Methodennamen zugreifen. Sie brauchen keine Instanz des Typs & hellip; [Betonung meiner]

I.e. Sie sollten in der Lage sein zu schreiben nameof(ClientService.EndDate) und haben es funktioniert, im Gegensatz zu Ihrer Aussage in der Frage, dass dies wäre "nicht normalerweise syntaktisch gültig".

Wenn Sie Probleme haben mit der Syntax, geben Sie bitte ein gutes Minimal, Complete, and Verifiable code example, die reproduziert zuverlässig, was Fehler Sie bekommen, und geben Sie den genauen Text der Fehlermeldung.

+1

Sie haben Recht. Ich hatte eine Reihe von Hirnschmerzen. –

+3

Es ist erwähnenswert, dass dies nicht in IntelliSense angezeigt wird (wie VS2015 Update 3 sowieso) –

+0

@MatthewSteeples: True. Irgendeine Abhilfe für dieses? – DarkKnight

0

Große Antwort von @Peter Duniho.

Bei Namenskonflikte können Sie auch wie folgt vorgehen:

ClientService clientservice; 
var str = nameof(clientservice.EndDate); 

nicht effizient, aber neugierig genug.