【问题标题】:Using the `is` operator with Generics in C#在 C# 中将 `is` 运算符与泛型一起使用
【发布时间】:2010-02-19 20:09:18
【问题描述】:

我想做这样的事情:

class SomeClass<T>
{
   SomeClass()
   {
        bool IsInterface = T is ISomeInterface;
   }
}

这样的事情最好的方法是什么?

注意:我不想用where 来约束T,但我希望我的代码能够知道T 实现了哪些类型的接口。我宁愿不必构造T

【问题讨论】:

  • 如果您在泛型方法/类中检查类型,IMO 出了点问题。
  • 我不想拥有 SomeClass 的 3 个独立后代。如果T 有什么东西,我想要一些关于某些事情的课程。

标签: c# generics types operators


【解决方案1】:

我认为您不能为此使用 is 运算符。但是你可以使用 IsAssignableFrom:

bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T));

【讨论】:

    【解决方案2】:

    应该改用跟随

     bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T));
    

    是运算符

    is运算符用于检查对象的run-time type是否 是compatible 和给定的type

    is 的使用符合语法的表达式,如果满足以下两个条件,则计算结果为 true:

    • 表达式不为空。
    • 表达式可以转换为类型。那 是,形式的转换表达式 (type)(expression) 将完成 不抛出异常。为了 更多信息,请参阅7.6.6 Cast expressions.

    参考文献

    【讨论】:

      【解决方案3】:

      你可以使用IsAssignableFrom:

        class SomeClass<T>
        {
           SomeClass()
           {
              bool IsIComparable = typeof(IComparable).IsAssignableFrom(typeof(T));
           }
        } 
      

      【讨论】:

        【解决方案4】:
        bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T))
        

        【讨论】:

          【解决方案5】:

          我相信你能做到最好:

          bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T));
          

          【讨论】:

            【解决方案6】:

            你可以尝试做类似的事情

            Type Ttype = typeof(T);
            

            这将为您提供 Type 类的全部功能,该类具有“FindInterfaces”之类的功能。

            【讨论】:

              猜你喜欢
              • 2019-10-02
              • 2014-08-06
              • 2011-09-29
              • 2010-12-19
              • 1970-01-01
              • 2014-02-06
              • 1970-01-01
              • 1970-01-01
              • 2011-08-19
              相关资源
              最近更新 更多