【发布时间】:2014-05-17 01:22:17
【问题描述】:
我正在尝试让表达式树有条件地计算为字符串。
到目前为止,这是我的代码:
IQueryable<Category> myCategories = DataUtil.Categories.AsQueryable();
ParameterExpression categoryParameterExpression = Expression.Parameter(typeof (Category), "category");
MemberExpression categoryNameMemberExpression = Expression.PropertyOrField(categoryParameterExpression, "CategoryName");
MemberExpression categoryNameLengthExpression = Expression.Property(categoryNameMemberExpression, typeof (string).GetProperty("Length"));
ConstantExpression constantLengthExpression = Expression.Constant(10, typeof (int));
BinaryExpression greaterThanLengthExpression = Expression.GreaterThan(categoryNameLengthExpression, constantLengthExpression);
var getNameInCapsMethod = typeof (Category).GetMethod("GetNameInCaps", BindingFlags.Instance | BindingFlags.Public);
MethodCallExpression getNameInCapsExpression = Expression.Call(categoryParameterExpression, getNameInCapsMethod, categoryNameMemberExpression);
ConditionalExpression ifGreaterThanLengthGetUpperNameExpression = Expression.IfThen(greaterThanLengthExpression, getNameInCapsExpression);
// I need something between the lambda and the ConditionalExpression to ensure that the void type is not returned?
var ifGreaterThanLengthGetUpperNameLambdaExpression = Expression.Lambda<Func<Category, string>>(ifGreaterThanLengthGetUpperNameExpression, new ParameterExpression[] { categoryParameterExpression });
foreach (var category in myCategories)
{
var upperName = ifGreaterThanLengthUpperLambda(category);
System.Windows.MessageBox.Show(upperName);
}
这是运行时发生的 ArgumentException:
“System.ArgumentException”类型的未处理异常发生在 System.Core.dll
附加信息:“System.Void”类型的表达式不能 用于返回类型'System.String'
我发现 ConditionalExpression 正在为“IfFalse”条件返回 void 类型。
这是我的 Expression Tree Visualizer 的屏幕截图:
我只想要字符串值。我意识到 ConditionalExpression 类型上有一个 Expression.IfThenElse,但我不确定在 Else 表达式中放入什么。 (如果可能的话,我不想只传回一个空字符串。)有没有办法让我确保仅在前面的 BinaryExpression 评估为真时才评估条件?无论如何,我该如何解决这个问题?
【问题讨论】:
标签: c# linq expression-trees