[英]How can I use dynamic condition in Lambda expression
我需要在config中配置条件,相同的东西将用作lambda表达式Where子句的条件。 下面是我尝试的代码,但是所有列表项都已设置了该值。
Test2 tt = new Test2();
tt.s2 = "TEST1";
tt.s3 = "TEST2";
tt.s4 = "TEST3";
Test2 tt1 = new Test2();
tt1.s2 = "TEST11";
tt1.s3 = "TEST21";
tt1.s4 = "TEST31";
Test2 tt2 = new Test2();
tt2.s2 = "TEST12";
tt2.s3 = "TEST22";
tt2.s4 = "TEST32";
List<Test2> test = new List<Test2>();
test.Add(tt);
test.Add(tt1);
test.Add(tt2);
var cond = "item => item.s2 == TEST1";
var test2List = test.Select(item => cond);
因此,有人可以建议我如何实现这个动态概念吗?
如果您试图将条件表示为字符串,那么动态LINQ可以为您做到这一点。 如果引用System.Linq.Dynamic
则可以编写如下条件
var cond = "s2 == \"TEST1\"";
var test2List = test.Where(cond);
test2List.ToList().ForEach(_ => Console.WriteLine($"{_.s2}, {_.s3}. {_.s4}"));
cond = "s2 == \"TEST1\" || s2 == \"TEST12\"";
test2List = test.Where(cond);
test2List.ToList().ForEach(_ => Console.WriteLine($"{_.s2}, {_.s3}. {_.s4}"));
产生
TEST1, TEST2. TEST3
TEST1, TEST2. TEST3
TEST12, TEST22. TEST32
你可以做类似的事情
var filters = new List<Func<f_results, bool>>();
if (s2test) filters.Add(x => x.s2 == myvar);
if (s3test) filters.Add(x => x.s3 == myvar2);
test.Where (item => filters.All(item));
您可以在各种情况下根据需要添加任意数量的过滤器,这取决于动态程度,但是您可以
if (s2test & s2equals) filters.Add(x => x.s2 == myvar) else if (!s2equals) filters.Add(x => x.s2 != myvar)
等等,因此您可以根据需要使用开关来构建语句。
根据此页面 ,您可以使用名为Dynamic Expresso的开源库从字符串创建lambda表达式。
var prices = new [] { 5, 8, 6, 2 };
var whereFunction = new Interpreter()
.ParseAsDelegate<Func<int, bool>>("arg > 5");
var count = prices.Where(whereFunction).Count();
我不确定我了解您想要什么,但我会尽力的。
可以说您的配置是这样的:
"s2 == TEST1"
在其他时间:
"s3 == TEST2"
因此,您需要创建Predict<Test2>
,主体将像这样:
var value= item.GetType().GetField("yourConfigField").GetValue(item);
return value == yourConfigValue;
当yourConfigFiled
为s2或s3并且yourConfigValue
为TEST1或TEST2时
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.