将非泛型对象传递到泛型集合
本文关键字:泛型 集合 对象 | 更新日期: 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());
}