在 C# 中将 `is` 运算符与泛型一起使用

Posted

技术标签:

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

我想做这样的事情:

class SomeClass<T>

   SomeClass()
   
        bool IsInterface = T is ISomeInterface;
   

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

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

【问题讨论】:

如果您在泛型方法/类中检查类型,IMO 出了点问题。 我不想拥有 SomeClass 的 3 个独立后代。如果T 有什么东西,我想要一些关于某些事情的课程。 【参考方案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.

参考文献

Does a Type Implement an Interface? is operator

【讨论】:

【参考方案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”之类的功能。

【讨论】:

以上是关于在 C# 中将 `is` 运算符与泛型一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin泛型 ② ( 可变参数 vararg 关键字与泛型结合使用 | 使用 [] 运算符获取指定可变参数对象 )

C#—类库委托is和as运算符泛型集合

空条件运算符不适用于泛型方法中的 Func<T>

C# 集合与泛型

为啥将 Collections.emptySet() 与泛型一起使用在赋值中而不是作为方法参数?

TypeScript,啥是对象文字的调用签名以及它们如何与泛型类型一起使用?