gpt4 book ai didi

C# 将字符串解析为 Func

转载 作者:行者123 更新时间:2023-12-03 23:34:07 25 4
gpt4 key购买 nike

我正在尝试解析字符串以创建 Func 实例。

public class A
{
public int fieldA { get; private set; }
public bool fieldB { get; private set; }
public List<int> fieldC { get; private set; }
}

检查 A 类实例的条件:

{
"Type" : "A"
"Condition" : "fieldA > 0 && fieldB == true"
}

当然可以修改字符串的格式,以便于解析。

我想创建的其实是:

Func<A, bool> condition = a => a.fieldA > 0 && a.fieldB == true;

解析 condition 字符串并不难,但由于 A 实例太多,因此在检查条件时使用反射是不可取的。我要做的是提前从字符串“构造”这个函数并将其缓存在某处,并在我想检查条件时调用缓存函数。

您能给我一些建议吗?

最佳答案

使用 System.Linq.Dynamic.Core你可以这样做:

public bool TestCondition(A obj, string condition)
{
var expr = DynamicExpressionParser.ParseLambda<A, bool>(ParsingConfig.Default, false, condition, new object[0]);
var func = expr.Compile();
return func(obj);
}

然后像这样调用它:

var testResult = TestCondition(anInstanceOfA, "fieldA > 0 && fieldB == true");

如果您想在表达式中使用局部变量,您可以这样做:

public static bool TestCondition(A obj, string condition, IDictionary<string, object> args)
{
var expr = DynamicExpressionParser.ParseLambda(new ParameterExpression[] { Expression.Parameter(typeof(A)) },
typeof(bool),
condition,
new object[] { args });

var func = expr.Compile();
return (bool)func.DynamicInvoke(obj);
}

然后像这样调用它:

var locals = new Dictionary<string, object>();
locals.Add("myInt", 0);
locals.Add("myBool", true);
var check = TestCondition(obj, "fieldA > myInt && fieldB == myBool", locals);

您还可以使该方法成为通用方法,以便在其他情况下重用它:

public static TOut TestCondition<TIn, TOut>(TIn obj, string condition, IDictionary<string, object> args)
{
var expr = DynamicExpressionParser.ParseLambda(new ParameterExpression[] { Expression.Parameter(typeof(TIn)) },
typeof(TOut),
condition,
new object[] { args });

var func = expr.Compile();
return (TOut)func.DynamicInvoke(obj);
}

.
.
.
TestCondition<A, bool>(obj, "fieldA > myInt && fieldB == myBool", locals)

关于C# 将字符串解析为 Func<T, bool>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63127849/

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