[英]Storing object implementing a generic interface in a collection
我有許多類都在實現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
s或多態與對抗/協方差,但你必須遵守它所擁有的規則, <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()
之前進行.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>
並且它是相同的
您需要使用非通用根接口:
public interface IWidget<T> : IWidget
{
}
或在聲明點指定類型:
List<IWidget<MyType>> widgetList;
你的IWidget接口是通用的,即它實際上是IWidget <T>嗎? 或者只是IWidget?
如果它不是通用接口,您只需要以下內容:
public class ContainingClass
{
List<IWidget> _widgetList;
}
如果它是通用接口,那么你需要的是這樣的:
public class ContainingClass<T> where T : class // or some other constraint for T
{
List<IWidget<T>> _widgetList;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.