我有一些都在实现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/