试试这个:
var validator_type = typeof (Validator);
var sub_validator_types =
validator_type
.Assembly
.DefinedTypes
.Where(x => validator_type.IsAssignableFrom(x) && x != validator_type)
.ToList();
foreach (var sub_validator_type in sub_validator_types)
{
Validator sub_validator = (Validator)Activator.CreateInstance(sub_validator_type);
}
此代码假定所有的子类生活在同一个组装/项目为Validator类。
此外,它假定每个子类都有一个公共无参数构造函数。
请注意,我不会推荐这种方法。
相反,你应该做这样的事情来解决问题(建模/使用多重校验):
public interface IValidator
{
bool Validate(SomeObject something);
}
public class FirstNameValidator : IValidator
{
public bool Validate(SomeObject something)
{
...
}
}
public class LastNameValidator : IValidator
{
public bool Validate(SomeObject something)
{
...
}
}
public class CompositeValidator : IValidator
{
private readonly IValidator[] m_Validators;
public CompositeValidator(params IValidator[] validators)
{
m_Validators = validators;
}
public bool Validate(SomeObject something)
{
foreach (IValidator validator in m_Validators)
{
if (!validator.Validate(something))
return false;
}
return true;
}
}
的CompositeValidator
包装多重校验,并知道如何验证使用这些验证对象。
您可以使用它像这样:
var composite_validator = new CompositeValidator(new FirstNameValidator() , new LastNameValidator());
composite_validator.Validate(obj);
太谢谢你了!所以我所拥有的与您提供的第二种解决方案非常相似(因为我正在学习一个教程)。我想知道是否可以通过循环创建验证的原因是能够编写一个新的验证器,并将它自动包含在composite_validator中。因此,每次我编写一个新的验证器时,不必将新验证器传递到复合验证器的参数中,我可以运行loadValidators函数,该函数立即将所有验证器添加到列表中,然后将此列表传递给参数composite_validator。 – user2085143
或者这是一个可怕的想法?所以而不是composite_validator(新的v1(),新的V2(),新的V3()等..)我可以去loadValidators(),然后composite_validator(人)。 – user2085143
我会用'composite_validator(new v1(),new v2(),new v3()等)。这就是你在[Composition Root]中编写应用程序的方式(http://blog.ploeh.dk/2011/07/28/CompositionRoot/) –