【问题标题】:Generic type constraint on generic type泛型类型的泛型类型约束
【发布时间】:2013-06-19 23:44:04
【问题描述】:

我有这样的课:

public class Proxy<TClient>()
    where TClient : ClientBase<TChannel>
{

}

我希望能够指定如下内容:

where TClient : ClientBase<TChannel>
where TChannel : class

没有在类定义中指定它,如下所示:

public class Proxy<TClient, TChannel>()

有没有办法做到这一点,或者我是否需要像上面那样定义第二种类型?

【问题讨论】:

  • TChannel 是从哪里来的?
  • 不,您不能这样做,是的,您需要在代理声明中指定第二个通用参数:Proxy&lt;TClient, TChannel&gt;
  • @Dan TChannelClientBase 所必需的(来自 System.ServiceModel)。没有非通用的替代品。
  • 我明白,但在你的代码中,它没有在任何地方定义。您必须将其声明为泛型类型参数,这是您要避免的。你所要求的无法完成。
  • 你在课堂上用TClient做什么?您可能会省略 TClient,而只使用 ClientBase&lt;TChannel&gt; 声明成员,具体取决于使用情况。

标签: c# generics type-constraints


【解决方案1】:

这是不可能的。您必须将TChannel 包含为Proxy 的泛型类型参数。

克服这个“限制”的一个选项(在引号中,因为它是由 C# 类型系统的工作方式产生的设计特性)是使用每个通道都应该实现的接口:

public interface IChannel { … }

public class Proxy<TClient>()
    where TClient : ClientBase<IChannel>
{ 
}

public class MyObscureChannel : IChannel { … }

public class MyObscureClient : ChannelBase<MyObscureChannel> { … }

…

var client = new Proxy<MyObscureClient>(…); // MyObscureChannel is implied here

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多