【问题标题】:Need approach for Setting value to a property based on numerous conditions [closed]需要根据多种条件为属性设置值的方法[关闭]
【发布时间】:2016-06-18 03:12:25
【问题描述】:

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

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

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

【问题讨论】:

  • 似乎在这里得到了回答:stackoverflow.com/questions/28049094/…
  • @Rahul 请发布您的一些代码。
  • @andreasnico 但那是 Java。如果您使用 C#,可能会有更优雅的解决方案
  • 如果你不明白我的回答,我更新了它以包含一个例子,看看它是否对你有帮助!

标签: c# .net if-statement conditional


【解决方案1】:

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

需要根据多个条件(每个属性大约 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 表达式列表调用该方法,忽略参数(因为它始终为 null)、通过引用传递的变量以及在满足所有条件时设置的值。

但是,这仅适用于变量,因为我很确定属性不能通过引用传递(使用 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。万岁!

【讨论】:

    猜你喜欢
    • 2021-01-25
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2011-10-03
    相关资源
    最近更新 更多