【发布时间】:2015-03-14 00:26:47
【问题描述】:
我有一些从字符串开始动态创建 lambda 的代码。例如,我有一个过滤器类,如下所示:
public class Criteria {
public string Property { get; set; }
public string Operator { get; set; }
public string Value { get; set; }
}
我可以从这样的 Criteria 实例开始创建像 x => x.Name == "Foo" 这样的 lambda
Criteria c = new Criteria() {
Property = "Name",
Operator = "equal",
Value = "Foo"
}
假设有一个类
public class Receipt {
public string Name { get; set; }
public int Amount { get; set; }
[other props omitted]
public ICollection<ReceiptDetail> Details { get; set; }
}
我想:
- 将 lambda 应用于任何对象(我知道 lambda 应该使用 Receipt 类的 ParameterExpression 创建)
- 取回 lambda 的布尔结果(例如,名称是否等于 Foo?)
- 对集合 Count() 方法应用相同的逻辑(例如,构建一个 lambda 来检查receipt.Details.Count()
这可能吗?
编辑:根据 cmets,我正在详细阐述我的需求。此代码将使我有机会回答我的要求,即:如果为我的对象指定了规则,那么应用程序的行为应该会有所不同。虽然这是一个常见的要求,但我想创建一个代码,允许我在添加更多规则时对其进行扩展。实际上我只有 5 种规则类型:
- 验证输入是否来自一周中的特定日期
- 验证输入是否在特定时间范围内
- 验证输入的字段“X”是否小于/等于/大于某个值
- 验证输入的“Y”字段是否包含值
- 验证作为集合的输入字段“Z”的计数是否小于/等于/大于某个值
对于前 4 点,我已经能够使用 P.Brian.Mackey answer 中的代码动态创建 lambda 表达式,我可以使用规范模式将其应用于对象本身。
最后一点需要以几乎相同的方式实现,但唯一的区别是表达式的左侧部分是方法调用而不是属性(特别是 ICollection<T>.Count() 方法)
【问题讨论】:
-
@ShaunLuttin:很抱歉,我认为建议的链接可以解决我的问题
-
可能是的。不平凡。
-
"我可以从这样的 Criteria 实例开始创建一个像 x => x.Name == "Foo" 这样的 lambda..." 你创建的 lambda 只是一个字符串吗?
-
@ShaunLuttin:不是。是
Expression<Func<T, bool>>的实例 -
这可以用动态 linq weblogs.asp.net/scottgu/… 完成吗?
标签: c# lambda expression expression-trees