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约束一起使用