将不同类型的参数传递给C#中接口定义的函数

我想将一组规则应用于业务对象的集合.这些是简单的规则,我不想使用任何现有的业务规则引擎.

我需要为每个规则传递不同的上下文,因此理论上每个规则都可能需要不同的参数.以下是我目前正在做的事情.还有其他/更好的方法吗?

注意:我使用访问者模式进行了评估,但对于这种特定情况似乎付出了太多努力.实际规则并不比我在示例中的规则复杂得多.

interface IParamBase {}

interface IParam : IParamBase
{
    string MyProperty {get; set;}
}

class Param : IParam
{
    public string MyProperty {get; set;}
}

interface IRule
{
    void Setup(IParamBase param);
    void Apply(BusinessObject businessObject);
}

class Rule :IRule
{
    IParam _param;
    public void Apply(BusinessObject businessObject)
    {
        businessObject.AssignedFromRule = _param.MyProperty;
        Console.WriteLine(businessObject.AssignedFromRule);
    }

    public void Setup(IParamBase param)
    {
        _param = param as IParam;
    }
}

class BusinessObject
{
    public string AssignedFromRule {get; set;}
}

void Main()
{
    var rule = new Rule();
    var param = new Param();
    param.MyProperty = "my property";
    BusinessObject businessObject = new BusinessObject();
    rule.Setup(param);
    rule.Apply(businessObject);
}

更新:我忘了向示例添加我需要的向下转发.

最佳答案 您的代码实际上是访问者模式.如果业务对象具有类似BusinessObject.Apply(BusinessRule规则)的方法{rule.apply(this);则更清楚. };

它与完整实现的目的相同:您可以添加操作(业务规则),而无需扩展执行操作的对象(业务对象).

您可能对使用Composite感兴趣,因此您可以将一组规则应用为一个规则.您也可能有兴趣对您在访问者实现中使用的calsses更加明确,但如果它适用于您,请继续使用它.

点赞