在 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:
参考文献
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 关键字与泛型结合使用 | 使用 [] 运算符获取指定可变参数对象 )