Reputation: 3752
I regularly want to get the name of an instance property of a type, when I have no instance. Currently to do this, I use the following inhouse function which interprets the Expression[Func[T, object]]
parameter and returns the property name:
var str = LinqExtensions.NameOf<ClientService>(x => x.EndDate);
// Now str == "EndDate"
However it seems a shame not to use the built in nameof
operator.
Unfortunately it seems that the nameof
operator requires either an instance, or, to reference a static properties.
Is there a neat way to use the nameof
operator instead of our in house function? For example:
nameof(ClientService.EndDate) // ClientService.EndDate not normally syntactically valid as EndDate is instance member
EDIT
I was completely wrong, the syntax nameof(ClientService.EndDate)
as described actually works as is.
Upvotes: 54
Views: 21960
Reputation: 70701
In the past, the documentation explicitly explained this, reading in part:
In the examples you see that you can use a type name and access an instance method name. You do not need to have an instance of the type… [emphasis mine]
This has been omitted in the current documentation. However, the examples still make this clear. Code samples such as Console.WriteLine(nameof(List<int>.Count)); // output: Count
and Console.WriteLine(nameof(List<int>.Add)); // output: Add
show how to use nameof
to obtain the string
value with the name of an instance member of a class.
I.e. you should be able to write nameof(ClientService.EndDate)
and have it work, contrary to your observation in the question that this would be "not normally syntactically valid".
Upvotes: 68
Reputation: 4969
Great answer by @Peter Duniho.
In case of name clashes, you can also do the following:
ClientService clientservice;
var str = nameof(clientservice.EndDate);
Not efficient, but curious enough.
Upvotes: 6