我正在构建一个辅助方法,它接受一个模型表达式并对其值进行处理,如:
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
,其中属性信息包含Name
的信息。当我尝试获取该值时,它会尝试在这种意义上获得model.Name
并崩溃。
如何在C#中使用表达式获取孙子孙女的价值?
答案 0 :(得分:1)
Name
中的 model.SomeChild.Name
不是您的模型类的属性。没有嵌套属性这样的东西。 Name
是对SomeChild
get操作返回的对象的属性获取操作。它有点像get_Name(get_SomeChild(model))
或model.get_SomeChild().get_Name()
(伪代码)。
在您的代码中,您需要以递归方式解压缩MemberExpressions
并从中构建字符串。