如何在C#中的表达式中获取孙子的价值?

时间:2016-08-22 15:32:12

标签: c# reflection expression

我正在构建一个辅助方法,它接受一个模型表达式并对其值进行处理,如:

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#中使用表达式获取孙子孙女的价值?

1 个答案:

答案 0 :(得分:1)

Name中的

model.SomeChild.Name不是您的模型类的属性。没有嵌套属性这样的东西。 Name是对SomeChild get操作返回的对象的属性获取操作。它有点像get_Name(get_SomeChild(model))model.get_SomeChild().get_Name()(伪代码)。

在您的代码中,您需要以递归方式解压缩MemberExpressions并从中构建字符串。