解决IDictionary <tkey,tvalue =“”> </tkey中缺乏共同/逆转的问题,>

时间:2014-11-30 21:13:39

标签: c# .net dictionary casting covariance

我有一个低级别的类,有这样的属性:

public IDictionary<IHttpParam, IHttpArg> Parameters {get;}

我的一个更高级别的类使用此类,但也公开了它自己的名为Parameters的属性,但使用了不同的类型:

public IDictionary<CommandParameter, ICommandArgument> Parameters {get;}

CommandParameter实现IHttpParam接口,ICommandArgument扩展了IHttpArg接口,理想情况下,我希望能够像这样实现它:

public IDictionary<CommandParameter, ICommandArgument> Parameters { get { return this.httpReq.Parameters; } }

遗憾的是,由于IDictionary界面缺乏共同/逆转,这是不可能的。我理解为什么它不能支持这种语言功能的技术原因,但解决这个问题的最佳方法是什么?

我想一个选项是创建并返回一个包装器IDictionary<TKey, TVal>,它将对IDictionary<CommandParameter, ICommandArgument>的所有调用转换为对底层IDictionary的调用。包装器会通过从一个接口到另一个接口的大量转换实现这一点,我认为这可能会损害性能。有更好的解决方案吗?

感谢。

1 个答案:

答案 0 :(得分:2)

我会写一些像public ICommandArgument GetParameter(CommandParameter param)这样的方法,或者以其他一些懒惰的方式实现Parameters字典作为函数。不幸的是,我无法看到任何方式,但我不认为这里的性能损失如此之高。您正在处理HTTP,因此强制转换几乎不会成为瓶颈。