List 是否只接受某些类型?

是否有可能有一个通用的List并对类型有约束? 我想将类型存储在列表中以进行查找,但仅限于此类类实现特定接口的类型。

像这样的东西:

 List : where typeof(Type) is IMyClass 

那可能吗? 如果没有,您对如何解决这个问题有任何建议吗?

任何帮助赞赏!

编辑:

对不起,我对这个问题一直不太清楚,但是下面的Sign的评论是正确的,我没有可用的实例,只是类型。

假设如下:

 class PluginA : IPlugin { } class PluginB : IPlugin { } class PluginC : ISomeOtherInterface { } var pluginTypes = new List() pluginTypes.Add(typeof(PluginA) --> OK pluginTypes.Add(typeof(PluginB) --> OK pluginTypes.Add(typeof(PluginC) --> should fail 

是的,我可以包装它,但希望有一个更好的变体,它在编译期间检查或提示intellisense允许哪些类型。

如果我理解正确,你需要一个System.Type列表,它检查它的元素是否实现某个接口。 这很容易实现。 只需通过包装大多数Listfunction并添加几个检查来实现IList

 public class TypeFilteredList : IList { private Type filterType; private List types = new List(); public TypeFilteredList(Type filterType) { this.filterType = filterType; } private void CheckType(Type item) { if (item != null && !filterType.IsAssignableFrom(item)) throw new ArgumentException("item"); } public void Add(Type item) { CheckType(item); types.Add(item); } public void Insert(int index, Type item) { CheckType(item); types.Insert(index, item); } 

 } 

此代码适用于基类和接口。

用法示例:

 TypeFilteredList list = new TypeFilteredList(typeof(IInterface)); list.Add(typeof(Implementation)); list.Add(typeof(int)); // ArgumentException 

但是,如果您不需要IListfunction,则可以实现IEnumerableISet (包装HashSet )。 List留下一个选项,可以多次添加相同的类型,在我看来,这是你不想要的东西。

那么你可以编写自己的包装器:

 public class ConstrainedList where T : IMyClass { private List list; // Access the list however you want } 

但是,您无法向List本身添加约束。

可能希望直接公开包装列表,或者您可能希望实现IList并将每个成员委派给列表。 如果不了解更多关于你想要实现的目标,很难说。

好吧,我通常不会这样做(答案是如此微不足道),但是没有人提出最明显的答案……inheritance。

 public sealed class IMyClassList : List { } 

做完了。

您可以为List指定任何类型,所以是:

 List myClassList = new List(); 

你可以尝试使用这样的generics:

  class EmployeeList where T : IMyClass { // ... } 

是 – 将其List然后您可以存储实现该接口的任何实例。

我只看到一种方法在编译时检查它。 您可以创建从List派生的类,并编写自定义通用Add方法来执行此操作。

像这样的东西:

 class PlugginsList : List { public void Add() where T : IPlugin { Add(typeof(T)); } } var plugginList = new PlugginsList(); plugginList.Add() --> OK plugginList.Add() --> OK plugginList.Add() --> will fail 

您将通过使用generics方法实现所有目标,即编译时间检查,智能感知和Visual Studio和C#编译器提供的所有其他类型的cheking工具