基于AST的同时使用And或Not表达式的C#表达式

基于AST的同时使用And或Not表达式的C#表达式,c#,.net,linq,lambda,C#,.net,Linq,Lambda,我想对一些动态特性使用Linq表达式。我需要和,或者不需要表达。。我不能得到太多 我们想检查系统中是否启用了某些功能,并根据这些功能决定是否显示菜单项。我们已经形成了XML格式的规则,我知道如何将规则转换为AST,但我不知道如何映射到Linq表达式 规则类似于:Feature1启用和Feature2启用或(Feature3禁用和未启用Feature5) 此处“Feature1Enabled”、“Feature2Enabled”等是功能的名称。我们将此字符串传递给IsFeatureEnabled函

我想对一些动态特性使用Linq表达式。我需要和,或者不需要表达。。我不能得到太多

我们想检查系统中是否启用了某些功能,并根据这些功能决定是否显示菜单项。我们已经形成了XML格式的规则,我知道如何将规则转换为AST,但我不知道如何映射到Linq表达式

规则类似于:Feature1启用和Feature2启用或(Feature3禁用和未启用Feature5)

此处“Feature1Enabled”、“Feature2Enabled”等是功能的名称。我们将此字符串传递给IsFeatureEnabled函数,以检查功能是否已启用

  public delegate bool IsEnabledDelegate(string name, string value);

    public static bool IsFeatureEnabled(string name, string value)
    {
        if (name == "MV")
            return true;

        if (name == "GAS" && value == "G")
            return true;
        //More conditions goes here
        return false;
    }

    static void Main(string[] args)
    {
        Expression<Func<string, string, bool>> featureEnabledExpTree = 
                      (name, value) => IsFeatureEnabled(name, value);

        //I want the equal of the following statement in C# Linq Expression

       bool result = IsFeatureEnabled("MV", "") && IsFeatureEnabled("GAS", "G") || !IsFEatureEnabled("GAS", "F")

    }
公共委托bool IsEnabledDelegate(字符串名称、字符串值);
公共静态bool IsFeatureEnabled(字符串名称、字符串值)
{
如果(名称=“MV”)
返回true;
如果(名称=“气体”&&value=“G”)
返回true;
//这里有更多的条件
返回false;
}
静态void Main(字符串[]参数)
{
表达式featureEnabledExpTree=
(名称,值)=>IsFeatureEnabled(名称,值);
//我想要C#Linq表达式中下列语句的等式
bool result=IsFeatureEnabled(“MV”、“G”)和&IsFeatureEnabled(“GAS”、“G”)||!IsFeatureEnabled(“GAS”、“F”)
}
我想要和这个相当的 bool result=IsFeatureEnabled(“MV”、“G”)和&IsFeatureEnabled(“GAS”、“G”)||!IsFEatureEnabled(“气体”、“F”)


以Linq表达式格式。。但是,我可以根据AST符号动态地将它们转换为

非常感谢你。。如果您需要更多信息,请在评论中告诉我。

像这样吗

Expression<Func<bool>> featureEnabledExpTree = () =>
    IsFeatureEnabled("MV", "") &&
    IsFeatureEnabled("GAS", "G") ||
    !IsFEatureEnabled("GAS", "F");
Expression featureEnabledExpTree=()=>
IsFeatureEnabled(“MV”和“”)&&
IsFeatureEnabled(“气体”、“G”)||
!IsFEatureEnabled(“气体”、“F”);
参数Expression name=Expression.Parameter(typeof(string),“name”),
value=Expression.Parameter(typeof(string),“value”);
//反向构建
表达式体=表达式常数(false);
body=Expression.Condition(
安达尔索(
表达式.Equal(名称、表达式.常数(“气体”)),
表达式.Equal(值,表达式.常量(“G”))
)表达式。常数(真),体);
body=Expression.Condition(
Expression.Equal(名称、表达式常数(“MV”)),
表达式。常量(真),主体);
表达式特性EnabledExptree=
表达式.Lambda(主体、名称、值);
//隔离试验
var featureEnabledFunc=featureEnabledExpTree.Compile();
bool isMatch1=featureEnabledFunc(“MV”和“”)
&&功能强大的Func(“气体”,“G”)| | |!可实现功能的融资(“天然气”、“F”);

然后,如果还需要第二部分作为表达式树:

    //I want the equal of the following statement in C# Linq Expression
    Expression<Func<bool>> test =
        Expression.Lambda<Func<bool>>(
            Expression.OrElse(
                Expression.AndAlso(
                    Expression.Invoke(featureEnabledExpTree,
                        Expression.Constant("MV"),
                        Expression.Constant("")
                    ),
                    Expression.Invoke(featureEnabledExpTree,
                        Expression.Constant("GAS"),
                        Expression.Constant("G")
                    )
                ),
                Expression.Not(
                    Expression.Invoke(featureEnabledExpTree,
                        Expression.Constant("GAS"),
                        Expression.Constant("F")
                    )
                )
            )
        );

    bool isMatch = test.Compile()();
//我想要C#Linq表达式中下列语句的等式
表达测试=
Lambda(
奥莱尔斯酒店(
安达尔索(
Expression.Invoke(featureEnabledExpTree,
表达式。常数(“MV”),
表达式.常量(“”)
),
Expression.Invoke(featureEnabledExpTree,
表达式。常数(“气体”),
表达式。常数(“G”)
)
),
表情,不是(
Expression.Invoke(featureEnabledExpTree,
表达式。常数(“气体”),
表达式。常数(“F”)
)
)
)
);
bool isMatch=test.Compile();

你好,马克,非常感谢。是的,我需要在运行时构建表达式。。如果可能的话,请给我更多的细节。我不需要If声明。。或其他部分进行评估。我只需要表达式没有if语句。OrElse/AndAlso只是普通的C#&和| |运算符(它们的短路求值策略由表达式树中的名称表示)。(修改示例以显示基于数据在运行时构建featureEnabledExpTree)“但是我可以根据AST符号动态地将它们转换为”-这意味着它必须基于数据构建,因此编译器将C#翻译为表达式树的能力可能没有用处。
    //I want the equal of the following statement in C# Linq Expression
    Expression<Func<bool>> test =
        Expression.Lambda<Func<bool>>(
            Expression.OrElse(
                Expression.AndAlso(
                    Expression.Invoke(featureEnabledExpTree,
                        Expression.Constant("MV"),
                        Expression.Constant("")
                    ),
                    Expression.Invoke(featureEnabledExpTree,
                        Expression.Constant("GAS"),
                        Expression.Constant("G")
                    )
                ),
                Expression.Not(
                    Expression.Invoke(featureEnabledExpTree,
                        Expression.Constant("GAS"),
                        Expression.Constant("F")
                    )
                )
            )
        );

    bool isMatch = test.Compile()();