【问题标题】:C# list of "Type" that implements specific interface实现特定接口的“类型”的 C# 列表
【发布时间】:2015-08-27 07:05:36
【问题描述】:

我想创建一个 List<System.Type> listOfTypesOfGlasses ,其中 Type 必须实现一个特定的接口 IGlass ,所以我可以用眼镜类型加载它。 有没有办法在编译时强制执行这个约束(必须实现IGlass)?

【问题讨论】:

    标签: c# interface compile-time


    【解决方案1】:

    实现一个隐藏列表的方法/类。

    class YourClass {
        // intentionally incomplete
        private List<Type> listOfTypesOfGlasses;
        public void AddToList<T>() : where T: IGlass
        {
            listOfTypesOfGlasses.Add(typeof(T));
        }
    }
    

    编辑:下面是这里的原始答案,假设 Type 表示占位符,而不是 System.Type。

    您需要做的就是List&lt;IGlass&gt;。

    或

    您应该围绕具有约束的List&lt;T&gt; 编写自己的包装类。

    或

    子类List&lt;T&gt; 并对其施加通用约束 - 但是不鼓励这种做法。

    【讨论】:

    • 对于第一个想法 - 不 - 因为这将创建包含实现 IGlass 的类的实例的列表。我想要的不是类的实例,而是类Type 的实例,我知道包含的数据描述了实现IGlass 的类型。第二个和第三个想法 - 我不确定我该怎么做或它对我有什么帮助
    • 有没有办法为数组做到这一点?基本上我想用这个来初始化一个属性(C#新手,刚刚发现属性只能用数组初始化)
    • @YoavR。你不能同时拥有它 - 属性声明必须是完全编译时的,并且它们不适用于泛型。您使用的是哪个属性?也许你可以使用一些惰性逻辑。
    • @daniel-a-white - 我正在实现一个 Bar 类 - 它是常规酒吧、舞蹈酒吧等的基类,我想声明一个可以组织眼镜类型的属性用于酒吧
    • @YoavR。这听起来像是一个完全不同的问题。除了使用属性之外,可能还有更好的方法来做你想做的事。
    【解决方案2】:

    否 - typeof(IGlass) 和 typeof(Glass) 都是 Type 对象 - 不是可以在通用约束中过滤的不同类。存储的值没有通用限制。如果您想存储所有实现IGlass 的类型的实例,这是可能的,但您不能过滤可以存储的实际Type 对象。

    【讨论】:

      猜你喜欢
      • 2020-03-13
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2012-11-30
      • 2013-07-22
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多