gpt4 book ai didi

c# - 当需要不同数量和类型的参数时如何创建 Action 委托(delegate)列表

转载 作者:太空宇宙 更新时间:2023-11-03 14:10:06 24 4
gpt4 key购买 nike

我们有一组大约两打的类,它们继承自具有抽象 Validate 方法的基类。当然,每个类都有不同的验证需求,但它们之间的不同组合需要规则,因此,正如您可以想象的那样,这导致了大量代码重复,例如:

A 类需要规则 1、3、6 和 9
B 类需要规则 3、4 和 8
C 类需要规则 1、8 和 9
....

你明白了。

所以我想做一个简单的重构并创建一个验证装饰器,其中每个规则都封装在一个类和一个工厂中,该工厂将为每个类创建临时验证组合。

然后我开始认为每个规则都非常简单,而不是为装饰器创建所有管道,我可能只是将 Action 委托(delegate)存储在工厂中,这些委托(delegate)将填充 List(Action(T)) 这样每个类都将遍历执行每个委托(delegate)的列表。

问题是每个规则的参数数量和/或类型不同,例如:

规则 1 需要一个可为 null 的 DateTime、一个 DateTime 和一个枚举。
规则 2 需要一个可为 null 的 DateTime 和一个 DateTime。
规则 3 需要一个字符串 .....

这是可以完成的事情,还是我别无选择,只能编写装饰器代码?

感谢您的想法。

更新:一些规则示例:

if(EndTime.HasValue && StartTime > EndTime)  
Throw new Exception (...);

if(Status == StatusEnum.Pass && !EndTime.HasValue)
Throw new Exception (...);

if(string.IsNullOrEmpty(ProcessName))
Throw new Exception (...);

if(string.IsNullOrEmpty(ProductName))
Throw new Exception (...);

if(string.IsNullOrEmpty(CustomerName))
Throw new Exception (...);

所有涉及的类都有属性 DateTime? EndTimeDateTime StartTimeStatusEnum Statusstring ProcessName

最佳答案

首先,您可以创建一个包含所有参数的类,并使用 bool 值指示哪些是相关的。您也可以制作一个 Params 委托(delegate),但这有点难看(它还需要您将参数转换为对象数组)。

就个人而言,我会选择一个描述所有参数的类。

编辑:

这是 ValiationRuleParameters(包含参数的类)想法的示例:

    public class ValidationRulesParam
{
private readonly Dictionary<string, object> _parameters = new Dictionary<string, object>();

public bool AddParam(string name, object value)
{
if (!_parameters.ContainsKey(name))
return false;
_parameters.Add(name, value);
return true;
}

public bool IsTypedParameterSet(string name, Type valueType)
{
object value;
if (_parameters.TryGetValue(name, out value) == false)
return false;
return (value.GetType() == valueType);
}

public TValue GetParamValue<TValue>(string name)
{
object value;
if (_parameters.TryGetValue(name, out value) == false)
return default(TValue);
if (!(value is TValue))
return default(TValue);

return (TValue)value;
}

public object this[string name]
{
get { return GetParamValue<object>(name); }
set { AddParam(name, value); }
}
}

这有点像使用 params object[] 和使用普通字典的组合

您可以将此类的实例发送到您运行的每个验证规则(操作),阳 ionic 可以测试参数(及其类型)的存在。并获得它的值(value)。

这只是一个例子(还有很多可以改进的地方),但它应该能很好地表达这个想法。

关于c# - 当需要不同数量和类型的参数时如何创建 Action 委托(delegate)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8086224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com