簡體   English   中英

存儲在集合中實現通用接口的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM