非严格的多接口类型参数约束?

对不起,如果这是一个欺骗,但我似乎无法得到正确的关键字组合来过滤各种类型约束和generics问题(因为有很多)。

我有两个接口 – 让我们称它们为IOnlineIOffline

它们密切相关,因为它们描述了几乎相同的契约,但它们之间的关键差异之一是将使用具体实现的上下文。 这不完全是我的情况,但它很好地说明了问题。

然后,我有一些方法可以解决这些接口的具体实现。 有时这些方法只想处理一种类型而不是另一种类型。

很简单:

public void DoStuff(string foo) where T : IOnline {} 

踢球者正在实施可以在EITHER类型上操作的方法的代码。 我认为这是正确的,但在阅读编译错误时,我期望约束将被解释为“允许任何类型T在这里一般使用,如果它们实现IOnline OR IOffline”,实际上被解释为“允许任何类型”如果它们同时实现,则在这里使用T“。

 public void DoStuff(string foo) where T : IOnline, IOffline {} 

尝试实现具有相同名称但不同约束的两个单独方法失败,因为存在明显的歧义问题 – 我们没有超载,因为参数列表是相同的(因为期望的行为是相同的)。

可以为两种不同的方法使用两个不同的名称,每个方法都有适当的约束,但这看起来很糟糕,并使下游的其他东西成为屁股中的痛苦……可行但不理想。

我觉得必须有一些我在这里缺少的东西…我觉得在通用土地上非常舒服,但这是我第一次完成我所追求的目标,我觉得我只是在旋转我的车轮atm。

像第二个例子那样提供多个约束确实是附加的。 关于generics约束的MSDN页面有一点关于此。

你能让你的两个接口inheritance自基接口,并将方法约束到基类型吗?

这可能不是你问题的答案,但我自发地感觉你可能想要重构你的界面。 从你的问题:

它们密切相关,因为它们描述了几乎相同的契约,但它们之间的关键差异之一是将使用具体实现的上下文。

我对接口的看法是它们是契约 。 它们定义了某些东西的外观 ,而不是它应该如何表现 ; 这是实施的任务。 现在,我没有关于您的应用程序或问题域的信息,但我可能会尝试花一些时间来识别这些接口的相同部分并将它们移动到单个接口中,并且只将差异保留为单独的接口。 这样你就可以更轻松地浏览这些问题。

我认为在.NET中执行此操作的标准方法是使一个接口同时包含IOnline和IOffline函数,然后使用一些属性来说明哪些函数实际在特定类中实现。 您可以在.NET中的各个位置看到此模式,其中包含可能会或可能不会实现的Seek()方法以及可以测试的CanSeek属性。

它可能不是最干净的OO设计,但它有效。

丢失了一些编译时检查,但我看不到任何方法…你必须选择你想要使用的,(我假设你的偏好是在线):

 public void DoStuff(string foo) { Type type = typeof(T); if(type.GetInterfaces().Contains(typeof(IOnline))) doStuffOnline(foo); else if(type.GetInterfaces().Contains(typeof(IOffline))) doStuffOffline(foo); else throw new Exception("T must implement either IOnline or IOffline"); } private void doStuffOnline(string foo){ // can assume T : IOnline } private void doStuffOffline(string foo){ // can assume T : IOffline }