当前位置: 首页 > 知识库问答 >
问题:

需要根据众多条件为属性设置值的方法[已关闭]

段晨
2023-03-14

想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

我有许多属性分布在许多类中。这些属性的值需要根据许多条件进行分配(每个属性大约有5到8个值)。我正在为众多的“如果”条件寻找一个替代方案。

我很晚才遇到“规则引擎”,但AFAIK可以用来验证规则。

任何设计建议都会有很大帮助。

共有1个答案

姬泰
2023-03-14

我不确定这对你来说是不是一个“更好”的解决方案,但我会试着解释一下。

需要根据许多条件(每个属性大约5到8个)为这些属性分配值。

我想你的意思是你总是需要写这个,这很烦人:

if (condition1 && condition2 && condition3 && condition4 && condition5) {
    Property1 = Value1;
}

if (condition1 && condition2 && condition3 && condition4 && condition5) {
    Property2 = Value2;
}
// ...

我想也许这个方法可以解决你的问题?

public static void SetValueForPropertyIf<T>(Predicate<object>[] conditions, ref T property, T value) {
    foreach (var predicate in conditions) {
        if (!predicate(null)) {
            return;
        }
    }
    property = value;
}

您可以使用lambda表达式列表调用该方法,忽略参数(因为它总是空的),一个要通过引用传递的变量,以及一个要在满足所有条件时设置的值。

但是,这仅适用于变量,因为我很确定属性不能通过引用(使用 ref 关键字)传递。所以你必须像这样声明你的属性:

private int someVariable;

public int SomeVariable {
    get {return someVariable;}
    set {someVariable = value;}
}

如果您不喜欢不使用Predicate委托的参数,请定义您自己的委托!

public delegate bool MyDelegate();

这里有一个如何使用这种方法的例子,以防你不明白我的意思。

class MyClass {
    private int someVariable;

    public int SomeVariable {
        get {return someVariable;}
        set {someVariable = value;}
    }

    public MyClass() {
        someVariable = 10;
        MyDelegate[] conditions = {
            (() => 7 < 10),
            (() => 77 == 77),
            (() => "Sweeper is awesome".Contains("Sweeper")),
            (() => String.IsNullOrEmpty(""))
        };
        SetValueForPropertyIf(conditions, ref someVariable, 20);
    }
}

在此类的构造函数中,我首先创建了一些条件,这些条件都是正确的。然后,我使用这些条件调用该方法。请注意,我使用 someVariable(字段)而不是 SomeVariable (属性)作为 ref 参数。

然后您可以打印SomeVariable

MyClass mc = new MyClass();
Console.WriteLine(mc.SomeVariable);

输出是20。万岁!

 类似资料:
  • 问题内容: 我不确定如何在没有链接分配的情况下执行此操作(由于我要设置副本,因此这可能无法正常工作)。 我不想采用多索引熊猫数据框的子集,测试小于零的值并将其设置为零。 例如: 给 这表明它无法根据条件进行设置。或者,如果我进行了链接分配: 这给出了相同的结果(以及带有复制警告的设置) 我可以根据第一级是我想要的条件来遍历每一列: 这给出了预期的结果: 但是以某种方式,我觉得有比遍历各列更好的方法

  • 使用斜扣。ASP中的AspNetCore。NET Core webapp,我们有如下响应类型: 使用Swashback发出swagger API JSON时,这将变成: 这里的问题是,DateTime是一种值类型,不能为null;但是发出的Swagger API JSON没有将这两个属性标记为必需的。这种行为对于所有其他值类型都是一样的:int、long、byte等,它们都被认为是可选的。 为了完

  • 我有一个熊猫数据框。如果以前的值x小于50,而当前值大于50,我想为新列y添加一个值为1的新列。 我得到这个错误: 代码:

  • 问题 在你解析一个Document之后可能想修改其中的某些属性值,然后再保存到磁盘或都输出到前台页面。 方法 可以使用属性设置方法Element.attr(String key, String value), 和Elements.attr(String key, String value). 假如你需要修改一个元素的class 属性,可以使用Element.addClass(String clas

  • 3.1 构件属性值的设置 Tkinter 构件对象有很多属性,这些属性的值可以在创建实例时用关键字参数指定(未 指定值的属性都有缺省值): <构件类>(<父构件>,<属性>=<值>,...) 也可以在创建对象之后的任何时候通过调用对象的 configure(或简写为 config)方法来更改 属性值: <构件实例>.config(<属性>=<值>,...) 构件类还实现了一个字典接口,可使用下