C# 具有多个接口限制的方法参数

C# 具有多个接口限制的方法参数,c#,generics,parameters,interface,C#,Generics,Parameters,Interface,在C#中,可以定义具有两个接口限制的方法参数。这是有限度的。比如说 interface IA { int A {get;} } interface IB { int B {get;} } void Foo<T>(T param1) where T: IA, IB {} 接口IA { int A{get;} } 接口IB { int B{get;} } void Foo(T param1),其中T:IA,IB{} 因此,两个接口以及方法Foo的第一个参数(param1

在C#中,可以定义具有两个接口限制的方法参数。这是有限度的。比如说

interface IA
{
  int A {get;}
}
interface IB
{
  int B {get;}
}
void Foo<T>(T param1) where T: IA, IB    {}
接口IA
{
int A{get;}
}
接口IB
{
int B{get;}
}
void Foo(T param1),其中T:IA,IB{}
因此,两个接口以及方法
Foo
的第一个参数(
param1
)应该实现这两个接口


但这真的有用吗?在C#中,不可能将一个对象强制转换为多个接口?当然,一个类可以实现两个接口

您当然可以一次将其分配给一个:

IA asIA = param1;
IB asIB = param1;
此外,您可以将其用作其中之一,即使没有这些行(假设它们分别采用IA或IB参数)


如果模板化类需要来自多个接口的功能,这非常有用。例如,您可能要求类之间具有可比性,并且您还希望确保模板类的用户记住重写
ToString()
,以便可以显示数据


这是一个有点做作的答案,但是能够多次指定精确的接口允许您在其接口中保留功能,而不会造成混乱

有时,您需要同时使用多个类型的功能的泛化逻辑。例如,我曾经不得不在ASP.NET中的
按钮
链接按钮
图像按钮
控件上执行相同的逻辑。它们分别来自
网络控制
,并实现
IButtonControl
接口;没有将它们结合在一起的基类

我需要将一个处理程序连接到
单击
事件,该事件由
IButtonControl
公开,并通过
属性
集合设置客户端单击处理程序,该集合由
网络控制
公开。要启用同时执行这两项操作的方法,我唯一的选择是多类型约束:

private T CreateButton<T>() where T : WebControl, IButtonControl, new()
{
    var button = new T();

    button.Click += ...;

    button.Attributes["onClick"] = ...;

    return button;
}
private T CreateButton(),其中T:WebControl,IButtonControl,new()
{
var按钮=新的T();
按钮。单击+=。。。;
属性[“onClick”]=。。。;
返回按钮;
}

@Keith,我不明白。首先,
Foo
是一种方法而不是一种类型,所以“is a Foo”没有意义。其次,无论是
IAFunc
还是
IBFunc
都不必知道param1也是一个IB或IA(分别)。他们可以把它当作自己名字中类型的常规实例。算了吧。我明白你想说的是,你可以在Foo的上下文中作为一种方法来做。可能是@RobertMacLean的重复,而不是重复。这是另一种方式
private T CreateButton<T>() where T : WebControl, IButtonControl, new()
{
    var button = new T();

    button.Click += ...;

    button.Attributes["onClick"] = ...;

    return button;
}