2016-07-08 30 views
10

Desidero regolarmente ottenere il nome di una proprietà di istanza di un tipo, quando non ho un'istanza. Attualmente per fare questo, io uso la seguente funzione inhouse che interpreta il parametro Expression[Func[T, object]] e restituisce il nome della proprietà:Can C# nome della proprietà dell'istanza di riferimento dell'operatore senza istanza?

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

Tuttavia sembra un peccato non utilizzare il costruito nel nameof dell'operatore.

Sfortunatamente sembra che l'operatore nameof richieda un'istanza o, per fare riferimento a proprietà statiche.

C'è un modo pulito di usare l'operatore nameof invece della nostra funzione interna? Per esempio:

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

EDIT

ero completamente sbagliato, la sintassi nameof(ClientService.EndDate) come descritto in realtà funziona come è.

+1

Funziona solo - 'classe C {pubblico int P {get; }} '-' nameof (C.P) 'compila bene. –

risposta

25

Da the documentation:

Negli esempi si vede che è possibile utilizzare un nome di tipo e di accedere a un nome di metodo di istanza. Non è necessario disporre di un'istanza del tipo & hellip; [emphasis mine]

I.e. dovresti essere in grado di scrivere nameof(ClientService.EndDate) e farlo funzionare, contrariamente alla tua affermazione nella domanda che questo sarebbe "normalmente non sintatticamente valido".

Se hai problemi con la sintassi, si prega di fornire una buona Minimal, Complete, and Verifiable code example che riproduce in modo affidabile qualunque errore che stai ricevendo, e di fornire l'esatto testo del messaggio di errore .

+1

Hai ragione. Ho avuto una serie di brainfarts. –

+3

Vale la pena ricordare che questo non viene visualizzato in IntelliSense (a partire da VS2015 Update 3 in ogni caso) –

+0

@ MatthewSteeples: true. Qualche soluzione per questo? – DarkKnight

0

Grande risposta di @Peter Duniho.

In Caso di scontri, è possibile anche effettuare le seguenti operazioni:

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

non è efficiente, ma abbastanza curioso.