我正在构建一个助手方法,该方法接受模型表达式并对其值进行处理,如:
Html.EditorFor(expression)
(我可以使用:Html.EditorFor(m => m.Name)
我实现了这样的方法:
public static MvcHtmlString MyMethod<TModel, TProperty>(this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> expression)
{
TModel dataModel = html.ViewData.Model;
MemberExpression mexp = expression.Body as MemberExpression;
PropertyInfo pinfo = mexp.Member as PropertyInfo;
string currentValue = dataModel != null ? pinfo.GetValue(dataModel) as string : null; //exception on this line
[do something with the value...]
}
这适用于获取模型的直接子值,如model.Name
,但对于更高程度的引用,试图获得model.SomeChild.Name
等值会抛出异常:
Object does not match target type.
经过一番调查,发现成员表达式引用了SomeChild
,其中属性info保存了Name
的信息。当我尝试获得该值时,它会尝试在这种意义上获得model.Name
,然后崩溃。
如何在c#中使用表达式获得孙子的值?
model.SomeChild.Name
中的Name
不是你的模型类的属性。没有嵌套属性这样的东西。Name
是对SomeChild
get操作返回的对象进行的属性get操作。这有点像get_Name(get_SomeChild(model))
或model.get_SomeChild().get_Name()
(伪代码)。
在您的代码中,您需要递归地解压缩MemberExpressions
并从中构建一个字符串。