【发布时间】:2021-10-06 07:24:29
【问题描述】:
这个question是12年前问的,但是dotnet变化这么大,不知道现在有没有解决办法。
我有一个模型,代表我要执行的规则和运算符:
public class RuleStatement
{
public string Path { get; set; }
public string Operator { get; set; }
public int Value { get; set; }
}
来源:
public class Foo
{
public string Path {get;set;}
public int Value {get;set;}
}
我想在源上执行这个动态的where 操作符,所以只有符合所有规则的才会返回。示例:
List<Foo> source = new List<Foo>();
//Sample of source
source.Add(new Foo{Path="A", Value = 10});
source.Add(new Foo{Path="B", Value = 20});
source.Add(new Foo{Path="C", Value = 30});
//Scenario 1 => Expected to be true
List<RuleStatement> rules = new List<RuleStatement>();
rules.Add(new RuleStatement{Path="A", Operator = ">=", Value=10});
rules.Add(new RuleStatement{Path="B", Operator = "==", Value=20});
bool isMatch = rules.All(rule =>
source.Any(s => s.Path == rule.Path && s.Value $"{rule.Operator}" rule.Value));
//Scenario 2 => Expected to be false
List<RuleStatement> rules = new List<RuleStatement>();
rules.Add(new RuleStatement{Path="A", Operator = ">=", Value=100});
rules.Add(new RuleStatement{Path="B", Operator = "==", Value=20});
bool isMatch = rules.All(rule =>
source.Any(s => s.Path == rule.Path && s.Value $"{rule.Operator}" rule.Value));
我找不到任何可行的解决方案,那么是否可以在 .NET Core 5 上执行此动态 where 操作?
如果不可能,有什么办法可以解决这个问题?
【问题讨论】:
-
您可以为 Value 和 Operator 添加一些可能的值吗?你预计会发生什么?
-
因为 CSharp 是静态类型的并且是编译时语言,所以即使在 .NET 5.0 中也不支持基于字符串的运算符。您链接的帖子有适合这种语言限制的解决方法。
-
您听说过
Expression<Func<T,bool>>,其中T是您的班级。是的,您可以使用泛型和 Expression 类来做到这一点。 -
@WouterdeKort 我添加了一个更好的可能值示例。
-
我将使用
Dictionary<string, Func<string, RuleStatement, bool>>,其中T1=源值,T2=包含type的规则,用于转换和比较值。