工厂创建泛型类

jfc*_*c37 5 c# generics factory-pattern fluentvalidation

我有一个名为Validator的抽象类:

public abstract class Validator<T> where T : IValidatable
{
    public abstract bool Validate(T input);
}
Run Code Online (Sandbox Code Playgroud)

我有一些具体的实现.一个是AccountValidator:

public class AccountCreateValidator : Validator<IAccount>
{
    public override bool Validate(IAccount input)
    {
        //some validation
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个是LoginValidator:

public class LoginValidator : Validator<IAccount>
{
    public override bool Validate(IAccount input)
    {
        //some different validation
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在想要创建一个工厂来返回验证器实现的实例.就像是:

public static class ValidatorFactory
{
    public static Validator GetValidator(ValidationType validationType)
    {
        switch (validationType)
        {
            case ValidationType.AccountCreate:
                return new AccountCreateValidator();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我喜欢这样称呼它

Validator myValidator = ValidatorFactory.GetValidator(ValidationType.AccountCreate); 
Run Code Online (Sandbox Code Playgroud)

但是它不喜欢返回新的AccountCreateValidator()行,或者我将myValidator声明为Validator而不是Validator<SomeType>.任何帮助,将不胜感激.

Foo*_*o42 2

看来您正在使用工厂将枚举参数转换为具体的验证实现。但我想,虽然调用者不知道或不关心验证器的具体类型,但它可能确实知道它希望验证的类型。这应该意味着将 GetValidator 方法设置为通用方法是合理的:

public static Validator<TypeToValidate> GetValidator<TypeToValidate>(ValidationType validationType) where TypeToValidate : IValidatable
Run Code Online (Sandbox Code Playgroud)

然后调用代码将如下所示 Validator<IAccount> validator = ValidatorFactory.GetValidator<IAccount>(ValidationType.AccountCreate:)