Получить имя класса и имя свойства из выражения () => MyClass.Name - PullRequest
3 голосов
/ 18 февраля 2011

Скорее всего, это не дубликат, но я не смог найти правильный вопрос.

Я хочу получить "MyClass.Name" от () => MyClass.Name. Как определить параметр метода и как преобразовать выражение в строку?

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

Это Expression<Func<string>>, поэтому вы можете иметь:

void Foo(Expression<Func<string>> selector) {...}

или

void Foo<T>(Expression<Func<T>> selector) {...}

однако обратите внимание, что синтаксис MyClass.Name относится к свойству static ; если вам нужно свойство instance , вам может понадобиться что-то более похожее на Expression<Func<MyClass,string>> - например:

static void Foo<TSource, TValue>(
    Expression<Func<TSource, TValue>> selector)
{

}
static void Main() {
     Foo((MyClass obj) => obj.Name);        
}

Что касается реализации; в этом простом случае , мы можем ожидать, что Body будет MemberExpression, поэтому:

static void Foo<TSource, TValue>(
    Expression<Func<TSource, TValue>> selector)
{
    var member = ((MemberExpression)selector.Body).Member;
    Console.WriteLine(member.ReflectedType.Name + "." + member.Name);
}

Однако в общем случае это сложнее. Это также будет работать, если мы используем статический член:

static void Foo<TValue>(
    Expression<Func<TValue>> selector)
{
    var member = ((MemberExpression)selector.Body).Member;
    Console.WriteLine(member.ReflectedType.Name + "." + member.Name);
}
1 голос
/ 18 февраля 2011

Зависит от того, является ли Name статическим свойством.
1. Если это не статично, то MyClass.Name вообще не будет допустимым синтаксисом. Итак, давайте предположим, что в этом случае вы хотите получить class+property из использования локальной переменной следующим образом:

var instance = new MyClass();
string result = GetClassAndPropertyName(() => instance.Name);

Таким образом, реализация для GetClassAndPropertyName должна быть такой:

public static string GetClassAndPropertyName<T>(Expression<Func<T>> e)
{
    MemberExpression memberExpression = (MemberExpression) e.Body;
    return memberExpression.Member.DeclaringType.Name + "." + memberExpression.Member.Name;
}

Другой синтаксис вы можете найти в ответе Марка.

2. Name свойство также может быть статическим, что, на мой взгляд, маловероятно, но допускает следующий синтаксис, который является точным синтаксисом, который вы запросили:

string result = GetClassAndPropertyName(() => MyClass.Name);
...