Хранение классов с типами generi c в одном массиве - PullRequest
0 голосов
/ 14 июля 2020

У меня есть класс Validator<T> и множество других классов, которые наследуются от него, например: TagValidator : Validator<Tag>.

Допустим, я хочу создать один ModelValidator класс, в котором хранятся все классы, которые наследуется от Validator<T> и запускает специфику c one, когда я выполняю ModelValidator.Validate<T>(T model)

Есть ли способ сохранить классы с типом generi c в одном массиве или, возможно, в словаре?

1 Ответ

2 голосов
/ 14 июля 2020

Мне кажется, это не так сложно, как утверждают в комментариях.

Работают ли такие вещи?

void Main()
{
    var mv = new ModelValidator();
    mv.AddValidator(new TagValidator());
    mv.AddValidator(new FooValidator());
    
    var tag = new Tag();
    
    mv.Validate(tag);
}

public class ModelValidator
{
    private List<object> _validators = new List<object>();
    
    public void AddValidator<T>(Validator<T> validator)
    {
        _validators.Add(validator); 
    }
    
    public void Validate<T>(T model)
    {
        foreach (Validator<T> validator in _validators.OfType<Validator<T>>())
        {
            validator.Validate(model);
        }
    }
}

public abstract class Validator<T>
{
    public virtual void Validate(T model) { }
}

public class TagValidator : Validator<Tag> { }
public class FooValidator : Validator<Foo> { }

public class Tag { }
public class Foo { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...