【发布时间】:2019-06-19 21:28:20
【问题描述】:
我正在尝试实现this pattern。
从调用者开始,我想做这样的事情:
var validatore = new Validator();
validatore.AddRule<TestRule>("OK");
validatore.AddRule<int>(45);
validatore.Validate();
规则的执行:
public interface IValidationRule<T>
{
string Error { get; set; }
bool Validate(T arg);
}
public class TestRule : IValidationRule<string>
{
public string Error { get; set; }
public bool Validate(string arg)
{
return arg == "test";
}
}
问题在于验证器的具体实现。 我假设是这样的:
public interface IValidator
{
void AddRule<TRule>(dynamic arg);
ValidationResult Validate();
}
public class Validator : IValidator
{
public void AddRule<T>(dynamic arg)
{
???
}
public ValidationResult Validate()
{
forEach ...
}
}
我应该将每个通用规则放在一个集合对象 (AddRule) 的什么位置? 我的类似实现方式是否正确?
【问题讨论】:
-
根据您的用例,您可以使用简单的 Collection 或更具体的东西(例如,如果您有多个线程添加验证器,则使用 Concurrentlist
),但您可能需要某种 Collection 来保存所有规则你的验证器 -
@Brezelmann,这就是重点。我想我需要某种迭代对象的集合。关键是每个对象都有不同的类型,我不知道如何将它们聚合到一个结构中。
-
不是每个 Validationrule 都继承自 IValidationRule 接口吗?如果是这样,您可以使用它来使用可以包含 IvalidationRule 的所有可能实现的 Collection
。您只需新建您指定为类型的规则,然后将其放入集合中
标签: c# validation generics design-patterns