C# 逻辑计算器

C# 逻辑计算器,c#,.net,binary-tree,logical-operators,expression-evaluation,C#,.net,Binary Tree,Logical Operators,Expression Evaluation,我有一个程序,它需要支持“用户选项”来确定如何覆盖文件,用户可以从“选项”中进行选择,这些选项可能会导致多种组合,使所有可能的“如果……否则”语句难以编码,这种复杂的结果评估很难编码,而且它太长,也让我发疯 我希望通过某种“解析”来解决这个问题,以一种更快、更有机的方式评估所有可能的结果,而不需要长链的IF…ELSE块 是我的计划选项中的内容: 例如:用户已选择覆盖文件,并选择选项“文件大小”,选择“>=”作为此选项的标准,还选择了“文件日期”加上“=x”或“文件日期,=,我认为使用表达式树无

我有一个程序,它需要支持“用户选项”来确定如何覆盖文件,用户可以从“选项”中进行选择,这些选项可能会导致多种组合,使所有可能的“如果……否则”语句难以编码,这种复杂的结果评估很难编码,而且它太长,也让我发疯

我希望通过某种“解析”来解决这个问题,以一种更快、更有机的方式评估所有可能的结果,而不需要长链的IF…ELSE块

是我的计划选项中的内容:


例如:用户已选择覆盖文件,并选择选项“文件大小”,选择“>=”作为此选项的标准,还选择了“文件日期”加上“=x”或“文件日期,=,我认为使用表达式树无法解决您的问题。表达式树是可以在编译之前进行分析、改进或计算的函数表达式。当您想要创建一个流畅的配置时,这是一个很好的解决方案,该配置应该提供哪些属性提供由开发人员决定的一些配置(还有其他用例,但这超出了您的问题):

您的选择应该是:

我的意思是,您应该使用掩码而不是布尔值,.NET推荐使用枚举来实现掩码或标志


也就是说,您可以计算枚举值在整个枚举中是否定义了1个或N个可能的标志。

您必须能够在运行时计算布尔表达式(特别是如果用户可以添加自己的表达式)-->
config.EnableWhatever(x => x.HasWhatever)
[Flags]
public enum FileSizeOptions 
{
    None = 0,
    IfFileSizeIsGreaterThan = 1,
    IfFileSizeIsLowerThan = 2,
    OtherOption = 4,
    All = IfFileSizeIsGreaterThan | IfFileSizeIsLowerThan | OtherOptions
}

FileSizeOptions options = FileSizeOptions.IfFileSizeIsGreaterThan | FileSizeOptions.OtherOption;

if(options.HasFlag(FileSizeOptions.All))
{
    // Do stuff
} else if(options.HasFlag(FileSizeOptions.IfFileSizeIsGreaterThan))
{
   // Do stuff
} // and so on...