Expression
- это просто объект, представляющий то, что содержится в лямбда-выражении. Его можно осмотреть, как и любой другой объект. Вы можете думать об этом как о сложном виде Reflection, и, действительно, вы можете получить такие вещи, как Type
и PropertyInfo
для всего, что находится внутри него, если вы знаете, как его анализировать.
Этот пример демонстрирует, какпростое выражение типа m => m.FirstName
может быть проанализировано, чтобы выяснить, на какое свойство ссылаются:
public class MyModel
{
public string FirstName { get { return "John Jacob Jingleheimer Schmidt"; } }
}
public class Program
{
public static void Main()
{
var model = new MyModel();
var result = Test(m => m.FirstName, model);
Console.WriteLine(result);
}
public static TOut Test<TIn, TOut>(Expression<Func<TIn, TOut>> expression, TIn instance) where TOut: class
{
MemberExpression memberExpression = (MemberExpression)expression.Body;
var member = memberExpression.Member;
Console.WriteLine("The expression is a reference to '{0}.{1}'", member.DeclaringType.FullName, member.Name);
var compiled = expression.Compile();
var result = compiled(instance) as TOut;
return result;
}
}
Выход:
The expression is a reference to 'Example.MyModel.FirstName'
John Jacob Jingleheimer Schmidt
Ссылка на демонстрацию DotNetFiddle