以编程方式检查值是否与 C# 中的预定义规则匹配

Programatically check if values match predefined rules in c#

我使用条件 class 存储了一个规则列表,如下所述。我的目标是根据实际值检查这些规则。

例如

public class Condition
{
public string Field {get;set;}
public string Operation {get;set;}
public string Value {get;set;}
}

例如

new Condition("order_status", "is", "confirmed")

我如何检查订单实例的 属性 状态是否真的符合提供的条件?

public class Order
{
public string Status {get;set;}
}

我很乐意向您提供我尝试过的方法,但我真的不知道如何开始这个。

public class OrderConditionComparator
{
public void Compare(Order order, Condition condition)
{
    ...
}

}

我很确定这不是最优雅的方式,但您可以使用 List<Func<Order, bool>> 作为您的规则集,将规则添加到列表中,并为每个订单循环规则集并测试它是否通过所有规则。这是一个示例:

    public static void Main(string[] args) {

        var orders = new List<Order>();
        var ruleset1 = new List<Func<Order, bool>>();
        var ruleset2 = new List<Func<Order, bool>>();

        AddRules(ruleset1);
        AddRules2(ruleset2);
        AddOrders(orders);

        foreach (var order in orders) {
            bool passed = true;
            foreach (var rule in ruleset1) {
                if (!(rule.Invoke(order))) {
                    passed = false;
                    Console.WriteLine("Order with Id " + order.Id + " did not pass ruleset 1");
                    break;
                }
            }
            if (passed) Console.WriteLine("Order with Id " + order.Id + " passed ruleset 1");
            passed = true;
            foreach (var rule in ruleset2) {
                if (!(rule.Invoke(order))) {
                    passed = false;
                    Console.WriteLine("Order with Id " + order.Id + " did not pass ruleset 2");
                    break;
                }
            }
            if (passed) Console.WriteLine("Order with Id " + order.Id + " passed ruleset 2");
        }
    }

    // Just a few orders for testing
    private static void AddOrders(List<Order> orders) {
        orders.Add(new Order() { Id = 0, ClientName = "Joe", Status = Order.OrderStatus.Confirmed });
        orders.Add(new Order() { Id = 1, ClientName = "Mary", Status = Order.OrderStatus.Confirmed });
        orders.Add(new Order() { Id = 2, ClientName = "June", Status = Order.OrderStatus.Confirmed });
        orders.Add(new Order() { Id = 3, ClientName = "Joe", Status = Order.OrderStatus.Unconfirmed });
        orders.Add(new Order() { Id = 4, ClientName = "Lisa", Status = Order.OrderStatus.Unconfirmed });
    }

    // Rules in ruleset 1 checks if the user is called Joe and the order status is Confirmed
    private static void AddRules(List<Func<Order, bool>> ruleset1) {
        ruleset1.Add((order) => {
            return order.ClientName == "Joe";
        });
        ruleset1.Add((order) => {
            return order.Status == Order.OrderStatus.Confirmed;
        });
    }

    // Rules in ruleset 2 checks if the order status is Confirmed
    private static void AddRules2(List<Func<Order, bool>> ruleset2) {
        ruleset2.Add((order) => {
            return order.Status == Order.OrderStatus.Confirmed;
        });
    }

    public class Order {

        public int Id { get; set; }
        public string ClientName { get; set; }
        public OrderStatus Status { get; set; }

        public enum OrderStatus { Confirmed, Unconfirmed }

    }

除此之外,您还可以使用 LINQ,如 @itsme86 所建议:

    public static void Main(string[] args) {

        var orders = new List<Order>();

        AddOrders(orders);

        var confirmed = orders.Where(s => s.Status == Order.OrderStatus.Confirmed);

        foreach (var order in confirmed) {
            Console.WriteLine("Order with Id " + order.Id + " is confirmed");
        }
    }

    // Just a few orders for testing
    private static void AddOrders(List<Order> orders) {
        orders.Add(new Order() { Id = 0, ClientName = "Joe", Status = Order.OrderStatus.Confirmed });
        orders.Add(new Order() { Id = 1, ClientName = "Mary", Status = Order.OrderStatus.Confirmed });
        orders.Add(new Order() { Id = 2, ClientName = "June", Status = Order.OrderStatus.Confirmed });
        orders.Add(new Order() { Id = 3, ClientName = "Joe", Status = Order.OrderStatus.Unconfirmed });
        orders.Add(new Order() { Id = 4, ClientName = "Lisa", Status = Order.OrderStatus.Unconfirmed });
    }

    public class Order {

        public int Id { get; set; }
        public string ClientName { get; set; }
        public OrderStatus Status { get; set; }

        public enum OrderStatus { Confirmed, Unconfirmed }

    }