如何在C#中的表达式中获取孙子的值?
我正在构建一个helper方法,该方法采用模型表达式并使用其值执行某些操作,如:如何在C#中的表达式中获取孙子的值?,c#,reflection,expression,C#,Reflection,Expression,我正在构建一个helper方法,该方法采用模型表达式并使用其值执行某些操作,如: Html.EditorFor(表达式) (我可以用作:Html.EditorFor(m=>m.Name) 我实现了以下方法: public static MvcHtmlString MyMethod<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>&
Html.EditorFor(表达式)
(我可以用作: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...]
}
public static MvcHtmlString MyMethod(此HtmlHelper html,
表达式(表达式)
{
TModel dataModel=html.ViewData.Model;
MemberExpression mexp=表达式。主体作为MemberExpression;
PropertyInfo pinfo=mexp.PropertyInfo成员;
string currentValue=dataModel!=null?pinfo.GetValue(dataModel)为string:null;//此行异常
[做一些有价值的事情…]
}
这适用于获取模型的直接子级的值,如model.Name
,但对于更高级别的引用,尝试获取值,如model。SomeChild.Name
会引发异常:
对象与目标类型不匹配。
经过一些调查,发现成员表达式引用的是SomeChild
,其中属性信息包含Name
的信息。当我尝试获取值时,它尝试从这个意义上获取model.Name
,然后崩溃
如何使用C#?
模型中的表达式获取孙子的值。SomeChild.Name
不是模型类的属性。没有嵌套属性。Name
是对SomeChild
get操作返回的对象执行的属性get操作。有点像get_Name(get_SomeChild(model))
或model.get_SomeChild().get_Name()
(伪代码)
在您的代码中,您需要递归地解包
MemberExpressions
,并从中构建一个字符串。如果您只是尝试获取实际值,是否有任何理由使用表达式而不是Func
?当然,您可以将表达式编译为委托-尽管我不知道性能JonSkeet我还需要保留带有成员/属性名的完整表达式来生成HTML,这样我就可以在回发时将值绑定回我的模型。它将用作ASP.NET MVC组件,我希望保留HTML.XFor(m=>m.property)
convention.当您实际得到Html.XFor(m=>m.Foo.Bar)时,其余的工作就完成了
?@JonSkeet不,不是。我正在努力实现这一点。啊,那么你正在尝试替换所有当前功能?这听起来像是一项艰巨的工作……你可能会发现,到处都有这样的假设,即路径中只有一个标识符。哦,我需要递归地遍历表达式树?是的。制作C#compiler会生成一棵树并在调试器中检查它。可视化效果很糟糕,但你可以看出它的结构。好吧,我会深入研究一下。我认为可能有一种更健壮/内置的方法,但显然没有。