Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果泛型参数T作为接口传递,如何找出它的类型?_C#_Generics_Types - Fatal编程技术网

C# 如果泛型参数T作为接口传递,如何找出它的类型?

C# 如果泛型参数T作为接口传递,如何找出它的类型?,c#,generics,types,C#,Generics,Types,由于某些原因,这里无法解释这些原因,我需要知道传递的泛型参数的类型。我找到了一种方法,在T是可实例化类的情况下如何实现这一点: [...] T dummy=defaultT; 如果Dummy是MyClassA { //做点什么=>这很好用 } 否则,如果dummy是MyClassB { //做点别的。。。 } […]您可以获取表示T的类型,并使用以下属性: Type type = typeof(T); if (type.IsInterface) { ... } 如果您想知道传递了哪个

由于某些原因,这里无法解释这些原因,我需要知道传递的泛型参数的类型。我找到了一种方法,在T是可实例化类的情况下如何实现这一点:

[...] T dummy=defaultT; 如果Dummy是MyClassA { //做点什么=>这很好用 } 否则,如果dummy是MyClassB { //做点别的。。。 } […]您可以获取表示T的类型,并使用以下属性:

Type type = typeof(T);
if (type.IsInterface) {
    ...
}
如果您想知道传递了哪个接口,只需使用==来比较类型对象,例如

if (typeof(T) == typeof(IConvertible))

这回答了你的问题吗?Nit:可实例化类的defaultT返回null,而不是新实例。要创建一个新实例,需要细化T,例如,其中T:new和use new T。在这种情况下,编译器将简单地禁止在泛型参数使用站点使用非具体类型。。因此,T甚至不可能是一个裸接口。根据定义,任何“类”的defaultT始终为null,“is”-运算符不是在测试相等性,而是在测试兼容性。如果您的MyClassB是vom MyClassA派生的,那么您的第二个分支将是不可访问的代码,sind is MyClassA也对MyClassB的任何实例有效。