通常在lamda中,表达式如下(x => x.FirstName)
lamda将返回"FirstName"的值(可能是一个字符串(,但@Html.TextBoxFor(x => x.FirstName)
知道我指的是属性"FirstName",而不是FirstName返回的值。使用什么C#或编译器技术来实现这一点?我试着通读MVC源代码,但它超出了我的想象。
Expression
只是一个对象,表示lambda表达式中包含的内容。它可以像任何其他物体一样被检查。你可以把它看作是一种复杂的反射,事实上,如果你知道如何解析它,你可以得到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演示