将非泛型对象传递到泛型集合

本文关键字:泛型 集合 对象 | 更新日期: 2023-09-27 18:12:21

我有一组由这个接口定义的规则:

public interface IRule<in T>
    {
        bool IsBroken(T dataObject);
    }

示例实现:

class Rule1:IRule<DateTime>
    {
        public bool IsBroken(DateTime dataObject)
        {
            throw new NotImplementedException();
        }
    }
class Rule2:IRule<int>
{
    public bool IsBroken(int dataObject)
    {
        throw new NotImplementedException();
    }
}

我有另一个类,它返回的规则列表如下:

class RulesCollection
    {
        public IEnumerable<IRule<what>> GetAllRules()
        {
            yield return new Rule1();
            yield return new Rule2();
        }
    }

我在这里面临的问题是-如何传递规则1 &rule2变成IEnumerable<IRule<T>>,因为T对于不同的规则是不同的所以不允许这样做。有办法解决这个问题吗?

将非泛型对象传递到泛型集合

根据IsBroken返回值的含义,您可以执行如下操作:

public class RuleWrapper<T> : IRule<object>
{
    private readonly IRule<T> inner;
    public RuleWrapper(IRule<T> inner)
    {
        this.inner = inner;
    }
    public bool IsBroken(object obj)
    {
        return obj is T && this.inner.IsBroken((T)obj);
    }
}

然后:

public IEnumerable<IRule<object>> GetAllRules()
{
    yield return new RuleWrapper<DateTime>(new Rule1());
    yield return new RuleWrapper<int>(new Rule2());
}