0

我有一个接口 IDataControl:

public interface IDataControl
{
    ...
}

然后,我有一个带有 List<IDataControl> 变量的类。

List<IDataControl> items;


问题是当我尝试将此集合的元素添加到另一个表单或另一个控件的“控件”属性中时:

panel.Controls.Add(items[i]);

IDE 告诉我“最好的重载方法匹配......”因为“IDataControl”不是从“Control”继承的。

我理解这个错误,我知道我可以做一些铸造,比如:

panel.Controls.Add(   (Control)items[i]   );


但是,我想知道是否有一种“更清洁”的方式来做到这一点,不需要强制转换,也有严格的类型验证。



那么,是否可以表明“IDataControl”只能由 Control 派生对象实现?

public interface IDataControl where this : Control
{
    ...
}


或者,是否可以声明一个类和一个接口的变量?
像这样的东西:

Control:IDataControl item;
List<Control:IDataControl> items;




谢谢

4

1 回答 1

0

正如您已经了解的那样,System.Windows.Forms.Control 对您的界面一无所知。


public interface IDataControl where this : Control
{
    ...
}

你不能那样做。它适用于泛型类型约束, 接口也不能从类继承。接口具有以下属性:

  • 接口就像一个抽象基类:任何实现接口的非抽象类型都必须实现它的所有成员。

  • 接口不能直接实例化。

  • 接口可以包含事件、索引器、方法和属性。

  • 接口不包含方法的实现。

  • 类和结构可以实现多个接口。

  • 一个接口本身可以从多个接口继承。

您需要的可能是下一个:当您创建控件时,从您的界面继承它们。

在此主机控件中,您需要创建一个方法

private void AddDataControl(IDataControl dataControl)
{
   if(IDataControl is Control){
      //your logic
   }
   else{
      throw new ArgumentException();
   }
}

这只是一般的方法。取决于你的代码。

于 2012-08-17T10:22:07.717 回答