我有一些都在实现IWidget<T>接口的类。我想将它们添加到列表中,因此我定义了以下内容:

List<IWidget<T>> _widgetList;


在这里,编译器抱怨T未被识别:


  错误1找不到类型或名称空间名称'T'(您是否缺少using指令或程序集引用?)


有没有一种方法可以定义IWidget列表并仍然保留通用接口?

我正在使用.NET 3.5 SP1。

最佳答案

有几种方法可以执行此操作:

1)您需要一个非通用根目录:

public interface IWidget
{
      ...
}

public interface IWidget<T> : IWidget
{
      ...
}


这样您就可以使用List<IWidget> _widgetList;



2)您可以使用dynamic或具有相反/协方差的多态性,但是您必须按规则使用规则,<T>不能为值类型,并且必须强制转换访问但添加时不访问,例如:

IWidget<string> xxx = ...;

var widgetListDyn = new List<IWidget<dynamic>>();
var widgetListObj = new List<IWidget<object>>();

widgetListDyn.Add(xxx);
widgetListObj.Add(xxx);




3)或您可以将两种方法混合使用:

public interface IWidget : IWidget<object> {}


并且您可以将List<IWidget> _widgetList;与该技术配合使用,并且还需要在.add()之前进行强制转换:

List<IWidget> _widgetList = new List<IWidget>();
IWidget<string> xxx = ...;
IWidget xxx1 = (IWidget)xxx;

_widgetList.Add(xxx1);




4)您可以执行的最后一种方法是:

public class IWidgetList<T> : List<IWidget<T>> { }


如果您打算声明一个创建的很多列表,这将很有用,它使您避免使用List<IWidget<TYPE>>的丑陋语法,而是可以只使用:IWidgetList<TYPE>并且它是相同的

关于c# - 在集合中存储实现通用接口(interface)的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17235773/

10-09 08:46