我有一个如下界面:
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中一样)允许我获取截图,我想测试这些截图(获取像素,断言颜色是正确的))。
由于
答案 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
}
}