C# 的新手,如果这是一个愚蠢的问题,请原谅我。
如果我有一个名为 Validator 的基类,以及许多从此类继承的类,例如 validateFirstname、validateSecondname 等...是否可以编写一个方法来遍历每个子类并实例化每个子类?
类似的东西
public class loadValidators
{
public loadValidators()
{
foreach (subclass in class)
{
// instantiate class here
}
}
}
我们一如既往地感谢您的帮助。
最佳答案
试试这个:
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);
}
此代码假定所有子类都位于与验证器类相同的程序集/项目中。
此外,它假定每个子类都有一个公共(public)无参数构造函数。
请注意,我不推荐这种方法。
相反,您应该做这样的事情来解决您的问题(建模/使用多个验证器):
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);
关于C# 遍历子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795582/