Brendan Hill
Brendan Hill

Reputation: 3752

Can C# nameof operator reference instance property without instance?

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

Answers (2)

Peter Duniho
Peter Duniho

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

wonea
wonea

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

Related Questions