【发布时间】:2012-10-31 14:04:09
【问题描述】:
我一直在为一个项目构建一个小型访问规则模块,其中每个特定规则都由通用 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 对象?
【问题讨论】: