- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
obj.Prop"转换为 "parent => parent.obj.Prop"-6ren"> obj.Prop"转换为 "parent => parent.obj.Prop"-我有一个类型为 Expression> 的现有表达式;它包含类似 cust => cust.Name 的值. 我还有一个父类,其字段类型为 T .我需要一个接受上述作为参数并生成一个以父类 ( TMo-6ren">
我有一个类型为 Expression<Func<T, object>>
的现有表达式;它包含类似 cust => cust.Name
的值.
我还有一个父类,其字段类型为 T
.我需要一个接受上述作为参数并生成一个以父类 ( TModel
) 作为参数的新表达式的方法。这将用作 MVC 方法的表达式参数。
因此,cust => cust.Name
变成 parent => parent.Customer.Name
.
同样,cust => cust.Address.State
变成 parent => parent.Customer.Address.State
.
这是我的初始版本:
//note: the FieldDefinition object contains the first expression
//described above, plus the MemberInfo object for the property/field
//in question
public Expression<Func<TModel, object>> ExpressionFromField<TModel>(FieldDefinition<T> field)
where TModel: BaseModel<T>
{
var param = Expression.Parameter(typeof(TModel), "t");
//Note in the next line "nameof(SelectedItem)". This is a reference
//to the property in TModel that contains the instance from which
//to retrieve the value. It is unqualified because this method
//resides within TModel.
var body = Expression.PropertyOrField(param, nameof(SelectedItem));
var member = Expression.MakeMemberAccess(body, field.Member);
return Expression.Lambda<Func<TModel, object>>(member, param);
}
我目前收到的错误是当我有一个包含多个部分的字段时(即 cust.Address.State
而不仅仅是 cust.Name
)。我在 var member
上收到错误消息指定成员不存在的行 - 这是正确的,因为正文指的是父项的子项 ( Customer
) 而不是包含该成员的项目 ( Address
)。
这是我希望我能做的:
public Expression<Func<TModel, object>> ExpressionFromField<TModel>(FieldDefinition<T> field)
where TModel: BaseModel<T>
{
var param = Expression.Parameter(typeof(TModel), "t");
var body = Expression.PropertyOrField(param, nameof(SelectedItem));
var IWantThis = Expression.ApplyExpressionToField(field.Expression, body);
return Expression.Lambda<Func<TModel, object>>(IWantThis, param);
}
对于达到这一点的任何帮助,我们将不胜感激。
编辑:这被标记为可能与 this question 重复;然而,唯一真正相似的是解决方案(实际上是相同的)。组合表达式不是通过表达式访问嵌套属性的直观解决方案(除非一个人的直觉是由某些经验指导的,不应假设)。我还编辑了问题以注意解决方案需要适合 MVC 方法的参数,这限制了可能的解决方案。
最佳答案
您正在寻找的是编写表达式的能力,就像您可以编写函数一样:
public static Expression<Func<T, TResult>> Compose<T, TIntermediate, TResult>(
this Expression<Func<T, TIntermediate>> first,
Expression<Func<TIntermediate, TResult>> second)
{
return Expression.Lambda<Func<T, TResult>>(
second.Body.Replace(second.Parameters[0], first.Body),
first.Parameters[0]);
}
这依赖于以下方法将一个表达式的所有实例替换为另一个表达式:
public class ReplaceVisitor:ExpressionVisitor
{
private readonly Expression from, to;
public ReplaceVisitor(Expression from, Expression to)
{
this.from = from;
this.to = to;
}
public override Expression Visit(Expression ex)
{
if(ex == from) return to;
else return base.Visit(ex);
}
}
public static Expression Replace(this Expression ex,
Expression from,
Expression to)
{
return new ReplaceVisitor(from, to).Visit(ex);
}
您现在可以使用表达式来选择属性:
Expression<Func<Customer, object>> propertySelector = cust => cust.Name;
以及从模型中选择该对象的表达式:
Expression<Func<CustomerModel, Customer>> modelSelector = model => model.Customer;
并组合它们:
Expression<Func<Customer, object> magic = modelSelector.Compose(propertySelector);
关于c# - 将 Linq 表达式 "obj => obj.Prop"转换为 "parent => parent.obj.Prop",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271118/
如果我需要选择第 10 个父级,是否有更简洁的方法,然后重复 .parent() 10 次? $('#element_id').parent().parent().parent().parent().
从 angularJS 指南中的“如何创建通信指令”开始,https://docs.angularjs.org/guide/directive , 我正在尝试使用该布局来制作可导航的表单。 问题在于指
我有一个 jQuery 函数,需要获取元素父元素的位置。 它看起来像: function show(e) { //debugger; var nextTab
我正在尝试修复这个难看的代码。 RadGrid gv = (RadGrid) (((Control) e.CommandSource).Parent.Parent.Parent.Parent.Pare
我有一个 A 标签,可以触发它的曾曾曾祖 parent 的动画。以下所有方法都可以,但哪一个最有效,为什么? $(this).parent().parent().parent().parent().p
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在尝试定位绝对定位的 div 时遇到了一些问题。我猜它的工作方式应该是这样,但是我希望它与父对象的父对象而不是父对象一起使用,因为我有一个下拉列表,当我希望它像第一个一样保持在顶部时,它会跟随父对象
我正在做一些非常基本的 jQuery 东西,真正开始,我经常通过做类似的事情来向上导航 dom $(this).parent().parent().addClass('hello'); 我只是想知道是
此 HTML 结构有一个 div#page,其中当前页面内容将通过 Ajax 加载。内容始终由 section 标记组成,这些标记可以具有动态高度(相对于浏览器的百分比)或静态高度(以像素为单位)。
在 javascript 中是否有一种简单的方法来定位父对象的父对象? 我使用 this.parentNode 作为函数的元素来选择父节点,我尝试了 this.parent.parentNode 和
当遍历 pager.Pages 对象的 foreach 循环时,$data 是 self(正如预期的那样)。但是,$parent 应该是寻呼机对象,但它返回的是 WaterQualityResultV
在架构中,我想根据父级的 sibling 调整架构。 例如:如果 toggleMonday 为真,那么 weekdays -> monday 应该有一个特定的验证模式。 现在下面的例子有效。但是,它非
我想要完成的是,当用户将焦点放在文本框上时,其中的字段集将添加一个类“active_fieldset”,以便提供用户在表单中的位置的良好视觉提示。使用以下 javascript,它确实会影响父字段集,
我创建了这个函数来保存我的taches sauverTache(tache:Tache){ this.editionEnCours = true; tache.estReelle =
所以..这是我的问题..我有以下代码(示例): var GameObject = function (posX, posY, width, height) { this.posX = posX;
所以,我是 jQuery 的新手,我正在尝试更改关于函数触发器的 2 个级别的 div: 这是我的第一次尝试:我尝试找到最接近的“.node”,它是所有其他 div 的父级并编辑子 div。 fun
我想了解为什么使用 ng-repeat在repeat 的item 上有某个controller,那个item 的parent 和那个item 的祖父是同一个controller。我期待祖父成为父 Co
我想从我的组件 Controller 之一将 jsonModel 设置为我的 SAPUI5 组件。在组件内,我使用应用程序或 splitapp。 我想避免通过 ID 获取元素。从组件内的某个位置获取层
我不确定如何在标题上准确地表达出来,因为问题在我的场景中太具体了,但无论如何基本上我有两个类似于下面的外部类: class Config { public level: number = 1;
在我正在编写的这个脚本中,我发现自己连续使用 .parent() 最多七次来获取元素。虽然这有效,但似乎可以/应该有一种更简单的方法来完成我不知道的这个/功能。除了更多元素上更具体的类/ID 之外,还
我是一名优秀的程序员,十分优秀!