Lali
Lali

Reputation: 2866

Extension method to get property name

I have an extension method to get property name as

public static string Name<T>(this Expression<Func<T>> expression)
{
    MemberExpression body = (MemberExpression)expression.Body;
    return body.Member.Name;
}

I am calling it as

string Name = ((Expression<Func<DateTime>>)(() => this.PublishDateTime)).Name();

This is working fine and returns me PublishDateTime as string.

However I have an issue with the calling statement, it is looking too complex and I want some thing like this.

this.PublishDateTime.Name()

Can some one modify my extension method?

Upvotes: 6

Views: 8307

Answers (3)

Taher  Rahgooy
Taher Rahgooy

Reputation: 6696

Try this:

public static string Name<T,TProp>(this T o, Expression<Func<T,TProp>> propertySelector)
{
    MemberExpression body = (MemberExpression)propertySelector.Body;
    return body.Member.Name;
}

The usage is:

this.Name(x=>x.PublishDateTime);

Upvotes: 13

CodeCaster
CodeCaster

Reputation: 151690

You can't do this.PublishDateTime.Name(), as the only thing that will be passed into the extension method is the value or reference on which you call the extension method.

Whether it's a property, field, local variable or method result doesn't matter, it won't have a name that you can access inside the extension method.

The expression will be "verbose", see How can I add this method as an extension method to properties of my class? (thanks @Black0ut) to put it in a static helper class.

Upvotes: 2

janhartmann
janhartmann

Reputation: 15003

With C# 6.0, you can use:

nameof(PublishDateTime)

Upvotes: 11

Related Questions