如何在c#表达式中获得孙子的值



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

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并从中构建一个字符串。

相关内容

  • 没有找到相关文章

最新更新