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

时间:2010-09-08 00:31:01

标签: c# generics parameters interface

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

interface IA
{
  int A {get;}
}
interface IB
{
  int B {get;}
}
void Foo<T>(T param1) where T: IA, IB    {}

因此,两个接口和方法param1的第一个参数(Foo)应该实现两个接口。

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

3 个答案:

答案 0 :(得分:4)

有时您会使用通用化逻辑,这种逻辑需要同时使用多种类型的功能。例如,我曾经不得不在ASP.NET的ButtonLinkButtonImageButton控件上执行相同的逻辑。它们各自分别派生自WebControl并实现IButtonControl接口;没有将它们统一起来的基类。

我需要将处理程序连接到由Click公开的IButtonControl事件,并通过Attributes集合设置客户端点击处理程序,该集合由WebControl公开。要启用同时执行这两种操作的方法,我唯一的选择是多种类型约束:

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

    button.Click += ...;

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

    return button;
}

答案 1 :(得分:3)

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

IA asIA = param1;
IB asIB = param1;

此外,你可以使用它,即使没有这些行(假设它们分别采用IA或IB参数)

IAFunc(param1);
IBFunc(param1);

答案 2 :(得分:2)

如果模板化类需要来自多个接口的功能,这非常有用。例如,您可能要求类可以相互比较IComparable,并且还要确保模板类的用户记住覆盖ToString()以便显示数据,{{3 }}

这有点像一个人为的答案,但能够多次指定精确的界面,可以让你在界面中保持功能,而不会让一个人混乱。