gpt4 book ai didi

c# - 迭代 lambda 表达式的属性

转载 作者:太空狗 更新时间:2023-10-29 19:39:35 26 4
gpt4 key购买 nike

我正在尝试通用化一个复杂的控件,该控件在我的网站中经常使用,但具有不同的领域。控件中的功能始终相同,只是基础字段发生了变化。

为了实现显示不同字段的方法,我试图创建一个接受 Expression<Func<TModel,TProperty>> 的 HTMLHelper 扩展。作为参数,它将包含在控件中显示所需的类的属性。例如:

View :

@model Project.Core.Page
@Html.MyHelper(p => new { p.Author.Name, p.Author.Location, p.Author.Age });

这是我遇到问题的扩展 - 我如何遍历 lambda 中提供的参数来为每个参数提供 TextBoxFor() ,甚至手动创建一个 input元素并用 value 填充它和 name lambda 参数?

伪扩展:

public static MvcHtmlString MyHelper<TModel,TProperty>(
this HtmlHelper<TModel> helper,
Expression<Func<TModel,TProperty>> expression) {
foreach (var parameter in expression.???) {
// helper.TextBoxFor(???)
// TagBuilder("input").Attributes("name", expression.???)
}
}

我觉得我已经盯着它看太久了,而且我还觉得我忽略了一种更简单的方法来实现它。

非常感谢任何帮助。如果您需要更多详细信息,或者我遗漏了一些重要信息,请告诉我。

最佳答案

如果您假设以下情况:

  1. 输入表达式的结果是一个投影(返回一个新的对象,匿名或其他方式)
  2. 投影的元素都是MemberExpressions,并且不包含对模型或其子项的方法的调用

然后您可以使用以下方法实现您想要的:

编辑:

在意识到我的第一个示例无法处理具有复杂属性的对象后,我更新了代码以使用辅助方法来访问属性值。此方法使用递归遍历属性链以返回适当的值。

public static MvcHtmlString MyHelper<TModel,object>(
this HtmlHelper<TModel> helper,
Expression<Func<TModel,object>> expression) {

var newExpression = expression.Body as NewExpression;
TModel model = helper.ViewData.Model;

foreach (MemberExpression a in newExpression.Arguments) {

var propertyName = a.Member.Name;
var propertyValue = GetPropertyValue<TModel>(model, a);

// Do whatever you need to with the property name and value;

}

}

private static object GetPropertyValue<T>(T instance, MemberExpression me) {

object target;

if (me.Expression.NodeType == ExpressionType.Parameter) {
// If the current MemberExpression is at the root object, set that as the target.
target = instance;
}
else {
target = GetPropertyValue<T>(instance, me.Expression as MemberExpression);
}

// Return the value from current MemberExpression against the current target
return target.GetType().GetProperty(me.Member.Name).GetValue(target, null);

}

注意:我没有在我的 IDE 中将其直接实现为 MVC 扩展方法,因此可能需要对语法稍作改动。

关于c# - 迭代 lambda 表达式的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12358009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com