gpt4 book ai didi

c# - 如何将 Expression> 转换为 Expression>

转载 作者:行者123 更新时间:2023-11-30 18:07:56 24 4
gpt4 key购买 nike

以下是有效的,但我的 Body.NodeType 更改为 Convert,而不是 MemberAccess,这在获取 ModelMetadata.FromLambdaExpression 时出现问题:

private Expression<Func<TModel, TNewProperty>> ConvertExpression<TProperty, TNewProperty>(Expression<Func<TModel, TProperty>> expression)
{
Exression converted = Expression.Convert(expression.Body, typeof(TNewProperty));
var result = Expression.Lambda<Func<TModel, TNewProperty>>(converted, expression.Parameters);
return result;
}

在 ASP.NET MVC 2.0 的上下文中,我有自己的 EditorFor:

public MvcHtmlString EditorFor<TProperty>(Expression<Func<TModel, TProperty>> expression)

EditorFor 然后根据元数据在内部将调用委托(delegate)给特定方法,例如:

public DecimalTextBox DecimalTextBoxFor(Expression<Func<TModel, decimal?>> expression)

DecimalTextBox 有一个 decimal 类型的 Value 属性?所以我想设置它:

decimalTextBox.Value(expression.Compile()(ViewData.Model));

从 EditorFor 调用 DecimalTextboxFor 无法编译,因为类型不匹配,这就是我需要转换的原因。

上面的代码,做了转换,但是因为 Expression.Body.NodeType 改变了,ModelMetadata.FromLambdaExpression 不起作用,因为表达式类型需要是 ArrayIndex、Call、MemberAccess 或 Parameter。不接受转换。

我的解决方法是将 DecimalTextBoxFor 更改为:

public DecimalTextBox DecimalTextBoxFor(Expression<Func<TModel, TProperty>> expression)

并转换其中的值:

decimalTextBox.Value((decimal?) Convert.ChangeType(expression.Compile()(ViewData.Model), typeof(decimal?)));

另一种部分有效的转换是:

private Expression<Func<TModel, TNewProperty>> ConvertExpression<TProperty, TNewProperty>(Expression<Func<TModel, TProperty>> expression)
{
Expression<Func<TModel, TNewProperty>> convertedExpression = expression as Expression<Func<TModel, TNewProperty>>;
}

但是转换不同的值类型(例如单精度到 double )当然行不通。

我希望转换表达式本身...

最佳答案

不幸的是,如果不更改BodyNodeType,这是不可能的。 Convert 表达式是一个单独的表达式类型,代表一个实际操作。为了实现您想要实现的目标,该操作必须是“第一个”操作,即表达式树中最顶层的节点。

如果您解释为什么您认为您需要 NodeType 保持不变,我可能会提供一个解决方法。从语义上讲,这没有意义:旧表达式的 Body 代表一个特定的操作,而你的新 Body 代表一个不同的操作(即, 原始操作后跟 Convert)。你不能指望它代表旧操作并返回新操作的结果。

关于c# - 如何将 Expression<Func<T, TProperty>> 转换为 Expression<Func<T, TNewProperty>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3651710/

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