Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中的表达式中获取孙子的值?_C#_Reflection_Expression - Fatal编程技术网

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

如何在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>&

我正在构建一个helper方法,该方法采用模型表达式并使用其值执行某些操作,如:

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会生成一棵树并在调试器中检查它。可视化效果很糟糕,但你可以看出它的结构。好吧,我会深入研究一下。我认为可能有一种更健壮/内置的方法,但显然没有。