Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;使用泛型类型…<;T>;需要1个类型参数和泛型多个约束,并使用_C#_Generics - Fatal编程技术网

C# &引用;使用泛型类型…<;T>;需要1个类型参数和泛型多个约束,并使用

C# &引用;使用泛型类型…<;T>;需要1个类型参数和泛型多个约束,并使用,c#,generics,C#,Generics,我有一个界面如下: public interface ITestCase<T> where T : HtmlControl { IEnumerable<T> Execute(Manager manager); } 公共接口ITestCase,其中T:HtmlControl { IEnumerable Execute(经理); } HtmlControl是来自第三方程序集的基类 我有两个这个接口的实现 其中之一是返回null(由我指定),直到我确定了所需的逻辑(

我有一个界面如下:

public interface ITestCase<T> where T : HtmlControl
{
    IEnumerable<T> Execute(Manager manager);
}
公共接口ITestCase,其中T:HtmlControl
{
IEnumerable Execute(经理);
}
HtmlControl是来自第三方程序集的基类

我有两个这个接口的实现

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

问题是,我从表单的codebehind中将这第二个实现称为:

var LoginJuniper = new Login<ArtOfTest.WebAii.Controls.HtmlControls.HtmlDiv>();
LoginProcedure.Login(textBox1.Text, new Test1());
var LoginJuniper=new Login();
LoginProcedure.Login(textBox1.Text,newtest1());
Login类和所有其他类采用相同的类型约束参数(其中T是HtmlControl,所有这些参数都来自第三方API)

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

<T> where T : HtmlControl, IElement
其中T:HtmlControl,IElement
我是否可以传入任何类型,这些类型可能是IEElement的实现,而不是HtmlControl,反之亦然?仅通过1接口。这将非常有用,因为我想将更多类型传递给我的泛型类型约束,因为我从接口派生的接口和测试用例可以测试的不仅仅是HtmlControl类(也可以像在第三方API中一样测试IEElements实现),这允许我获得屏幕截图,我想测试这些屏幕截图(获取像素,断言颜色正确)


谢谢

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

但是,在使用多种约束类型的情况下,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
  }
}
void Foo(T参数)
{
if(arg是IElement)
{
var argAsIElement=arg作为元素;
//用argAsIElement做点什么
}
if(arg是HtmlControl)
{
var argAsHtmlControl=arg作为HtmlControl;
//使用argAsHtmlControl执行某些操作
}
}

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

但是,在使用多种约束类型的情况下,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
  }
}
void Foo(T参数)
{
if(arg是IElement)
{
var argAsIElement=arg作为元素;
//用argAsIElement做点什么
}
if(arg是HtmlControl)
{
var argAsHtmlControl=arg作为HtmlControl;
//使用argAsHtmlControl执行某些操作
}
}

你能发布一个完整的程序来演示这个问题吗?这个问题中没有正确的详细信息。试着专注于一个主要问题,如果以后需要,将其他问题留给另一个问题。向我们展示使用ITestCase的类和要执行的调用。我将在单独的线程中重新发布主要问题。谢谢。你能发布一个完整的程序来演示这个问题吗?这个问题中没有正确的详细信息。试着专注于一个主要问题,如果需要的话,把其他问题留给另一个问题。向我们展示使用ITestCase的类和要执行的调用。我将在单独的线程中重新发布主要问题。谢谢。另一个解决方案是创建一个封装HtmlControl(适配器)的IEElement实现,并将其与方法中的T:IEElement约束一起使用。另一个解决方案是创建一个封装HtmlControl(适配器)的IEElement实现,并将其与方法中的T:IEElement约束一起使用