我一直在为一个项目构建一个小型访问规则模块,其中每个特定规则都由一个通用Rule<TEntity>
对象反映。该规则需要一个委托来执行特定的逻辑。
有一个RulesContext
类提供方法来检查对某个实体“foo”的访问,如下所示:
rulesContext.CanIRead<Foo>(myFoo);
我的意图是将设置过程中构建的所有规则存储到一个集合中。但我尝试的每一种方法都会导致死胡同。
我想到了类似的东西:
IDictionary<Type, Rule<object>> _rules = new Dictionary<Type, Rule<object>>();
和:
var fooRule = new Rule<Foo>(foo => foo.FullfillsACertainFooCriterion())
_rules.Add(typeof(Foo), fooRule);
该CanIRead
实现将确保正确使用字典:
public bool CanIRead<TEntity>(TEntity entity)
{
var rule = _rules[typeof(entity)];
return rule.CanIRead(entity);
}
但是编译器不喜欢这样:Rule<Foo>
不能分配给类型为 的参数Rule<object>
。哪种是有意义的,因为它会违反合同(这表示我可以将字典的方法与任何对象一起用作参数,这对于仅接受 Foo 类型对象的 fooRule 不成立。- Liskov 原则)
但是我想不出解决这个问题的方法。如何将Rule
不同类型的对象存储在一个集合中?