Это 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);
}