@Html.TextBoxFor如何知道我指的是模型的属性,而不是该属性返回的值



通常在lamda中,表达式如下(x => x.FirstName)lamda将返回"FirstName"的值(可能是一个字符串(,但@Html.TextBoxFor(x => x.FirstName)知道我指的是属性"FirstName",而不是FirstName返回的值。使用什么C#或编译器技术来实现这一点?我试着通读MVC源代码,但它超出了我的想象。

Expression只是一个对象,表示lambda表达式中包含的内容。它可以像任何其他物体一样被检查。你可以把它看作是一种复杂的反射,事实上,如果你知道如何解析它,你可以得到TypePropertyInfo之类的东西

这个示例演示了如何解析像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演示

最新更新