![]() |
1
386
试试这个代码
|
![]() |
2
86
(由于大量重写而重新发布) Jaredpar的代码答案非常好,但是我有一个提示,如果您的泛型类型不基于值类型参数,那么它就不必要了。我被挂断了为什么“is”操作员不工作,所以我还记录了我的实验结果,以备将来参考。请加强此答案以进一步提高其清晰度。 提示:如果确保泛型类实现继承自抽象的非泛型基类(如GenericClassBase),则可以毫无困难地问相同的问题:
IsSub类()我的测试表明issubclassof()不适用于无参数泛型类型,例如
但是它将与
因此,如果您愿意基于someType进行测试,以下代码适用于任何泛型类的派生:
我唯一能想到的是,您希望通过genericClass进行测试的时间是在插件框架场景中。 关于“is”运算符的思考
在设计时,C不允许使用无参数泛型,因为它们在当时本质上不是完整的CLR类型。因此,必须用参数声明泛型变量,这就是为什么“is”运算符对于处理对象如此强大的原因。顺便说一下,“is”运算符也不能计算无参数的泛型类型。
“is”操作符将测试整个继承链,包括接口。 因此,对于任何对象的一个实例,下面的方法都可以做到这一点:
这有点多余,但我想我会继续为大家设想。 鉴于
以下代码行将返回true:
另一方面,如果您想要一些特定于泛型类的东西,我想您可以使它更具体一些,如下所示:
然后您要测试如下:
|
![]() |
3
33
我仔细检查了其中一些样品,发现在某些情况下它们是不足的。此版本适用于各种泛型:类型、接口及其类型定义。
以下是单元测试:
|
![]() |
4
20
在我看来,这种实现在更多情况下都可以工作(无论是否有启动的参数,无论子级和参数的数量如何,都是通用类和接口):
这是我的
测试的类和接口:
|
![]() |
5
9
Jaredpar的代码只适用于一个继承级别。对于无限级继承,请使用以下代码
|
![]() |
7
7
它可能有点杀伤力,但我使用如下扩展方法。它们检查接口和子类。它还可以返回具有指定泛型定义的类型。
例如,对于问题中的示例,它可以针对通用接口和通用类进行测试。返回的类型可用于
|
![]() |
8
4
基于上面Fir3rpho3nixx和David Schmitt给出的优秀答案,我修改了他们的代码,并添加了shouldinheritalimplementtypedgenericinterface测试(最后一个)。
|
![]() |
9
4
这一切都可以用LINQ轻松完成。这将找到属于泛型基类GenericBaseType子类的任何类型。
|
![]() |
10
4
简单的解决方案:只需创建第二个非泛型接口并将其添加到泛型类:
然后用你喜欢的任何方式检查一下
显然,只有当您有能力编辑泛型类(OP似乎有)时才可能,但是它比使用一个神秘的扩展方法更优雅和易读。 |
![]() |
11
4
添加到@jaredpar的答案中,下面是我用来检查接口的内容:
前任:
|
![]() |
12
2
JaredPar 如果我将typeof(type<gt;)作为tocheck传递,这对我不起作用。这就是我改变的。
|
![]() |
13
1
@EnocnRoll-Ananda Gopal的答案很有趣,但是如果一个实例没有预先实例化,或者您想要检查一个泛型类型定义,我建议使用以下方法:
使用方式如下:
有四种条件的情况
它应该与您想要测试的任意类或接口一起工作,并返回类似于使用
|
![]() |
14
0
|
![]() |
15
0
你可以试试这个分机
|
![]() |
16
0
比赛进行得太晚了…我也有另一种贾洛德帕的回答。 这里是类型。问题B(类型)反射镜的类别:
从这一点上,我们看到它并没有做任何过于疯狂的事情,它类似于Jaredpar的迭代方法。到目前为止,一切都很好。这是我的版本(免责声明:没有经过彻底测试,所以我知道如果你发现问题)
基本上,这只是System.Type的一个扩展方法-我这样做是为了有意将“thisType”类型限制为具体类型,因为我的直接用法是对类型对象执行linq查询“where”谓词。我敢肯定,如果你需要的话,所有聪明的人都能找到一种高效的、多用途的静态方法:)代码做了一些事情,但答案的代码没有。
其余基本上与Jaredpar的代码相同 |
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |