【问题标题】:Storing classes with generic types in a single array将具有泛型类型的类存储在单个数组中
【发布时间】:2020-07-14 18:25:26
【问题描述】:

我有一个类 Validator<T> 和许多其他继承自它的类,例如:TagValidator : Validator<Tag>

假设我想创建一个 ModelValidator 类来存储从 Validator<T> 继承的所有类,并在我执行 ModelValidator.Validate<T>(T model) 时运行特定的类

有没有办法将泛型类型的类存储在单个数组或字典中?

【问题讨论】:

  • 请分享minimal reproducible example,以便我们看到您尝试存储的两种不同的东西。
  • 您可以定义一个非泛型基类Validator,然后有一个Dictionary<Type, Validator> 并执行(Validator<T>)dict[typeof(T)]。或者循环通过Validator[] 类型的数组测试is Validator<T>。或者给你的Validator 类一个TryValidate(object) 方法,并尝试使用所有验证器进行验证
  • @JCode AbstractValidator<T> 实现IValidator<T> 实现IValidator,所以IValidator 是您的非泛型基类型。 IValidator 有一些 useful methods you could use
  • @JCode 我们已经讨论过这个问题:你将不得不投射。查看 Enigmativity 的答案
  • @JCode - 你无法避免强制转换。但是强制转换是最快的操作之一,因为它几乎是在编译时完成的。并且在可能的情况下,编译器会对其进行优化。

标签: c# .net


【解决方案1】:

我觉得这并不像 cmets 所说的那么难。

这种东西有用吗?

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 { }

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多