“使用泛型类型.... <t>需要1个类型参数和通用多个约束并使用</t>

时间:2009-10-14 09:55:38

标签: c# generics

我有一个如下界面:

public interface ITestCase<T> where T : HtmlControl
{
    IEnumerable<T> Execute(Manager manager);
}

HtmlControl是来自第三方程序集的基类。

我有两个这个接口的实现。

其中一个是返回null(由我指定),直到我确定所需的逻辑(不是一个困难的任务)。

问题是,我从我的表单的代码隐藏中调用了第二个实现:

var LoginJuniper = new Login<ArtOfTest.WebAii.Controls.HtmlControls.HtmlDiv>();
LoginProcedure.Login(textBox1.Text, new Test1());

Login类和所有其他类采用相同的类型约束参数(其中T是HtmlControl,所有这些都来自第三方API)。

另外,我遇​​到的另一个问题是当我使用多个类型约束时;是否可以说T可以是这些约束中的任何一个或任何一个?例如。如果我有:

<T> where T : HtmlControl, IElement

我可以传入任何可能是IElement的实现而不是HtmlControl的类型,反之亦然?只需1个界面。这将非常有用,因为我想将更多类型传递给我的泛型类型约束,因为我从接口派生的接口和测试用例可以测试的不仅仅是HtmlControls类(也可以测试IElements实现,就像在第三方API中一样)允许我获取截图,我想测试这些截图(获取像素,断言颜色是正确的))。

由于

1 个答案:

答案 0 :(得分:1)

我不确定你想要答案到底是什么(也许你可以尝试总结一下你的实际问题)。

但是,在使用多种约束类型的情况下,MSDN文档说:

  

通过约束类型参数,   你增加了允许的数量   操作和方法调用那些   受约束类型支持   继承中的所有类型   层次结构。因此,当你设计   通用类或方法,如果你   将执行任何操作   通用成员超越简单   分配或调用任何方法不   您将支持System.Object   必须对类型应用约束   参数。

这基本上意味着对象T必须实现您提供的所有约束。因此,您不能对非HtmlControl 实现IElement派生的类型使用该方法。

有一种方法可以解决这个问题,但它并不漂亮,你也可能会分开。但你可以这样做:

void Foo<T>(T arg)
{
  if (arg is IElement)
  {
    var argAsIElement = arg as IElement;

    // Do something with argAsIElement
  }
  if (arg is HtmlControl)
  {
    var argAsHtmlControl = arg as HtmlControl;

    // Do something with argAsHtmlControl
  }
}
相关问题