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