C# 获取泛型参数的类型

C# 获取泛型参数的类型,c#,generics,C#,Generics,我有以下课程 public interface InterfaceBase { } public class ImplementA:InterfaceBase { } public class ImplementB:InterfaceBase { } public void TestImplementType<T>(T obj) where T: InterfaceBase { } 但是这个表达式总是被计算为false 编辑:我将如何将obj强制转换为ImplementA或I

我有以下课程

public interface InterfaceBase
{
}

public class ImplementA:InterfaceBase
{
}

public class ImplementB:InterfaceBase
{
}

public void TestImplementType<T>(T obj) where T: InterfaceBase
{
}
但是这个表达式总是被计算为false


编辑:我将如何将obj强制转换为ImplementA或ImplementB?

obj是ImplementA
obj是ImplementA
如何:

 if(obj.GetType().Equals(typeof(ImplementA)))
 {
   // ...
 }
那么:

 if(obj.GetType().Equals(typeof(ImplementA)))
 {
   // ...
 }
typeof(T)
返回
T
系统的
Type
。Type
不实现
ImplementA
。你想要的是:

if (typeof(ImplementA).IsAssignableFrom(typeof(T))
{
}
typeof(T)
返回
T
系统的
Type
。Type
不实现
ImplementA
。你想要的是:

if (typeof(ImplementA).IsAssignableFrom(typeof(T))
{
}

严格地说,您应该避免泛型中过多的专门化。将任何专用逻辑放在接口的成员中会更干净,这样任何实现都可以以不同的方式完成。但是,有很多方法:

您可以测试“obj”(假设它是非空的)

您可以测试T的类型(实现A):

同样,您可以测试它是否为实现或子类:

    bool testAssign = typeof(ImplementA).IsAssignableFrom(typeof(T));

严格地说,您应该避免泛型中过多的专门化。将任何专用逻辑放在接口的成员中会更干净,这样任何实现都可以以不同的方式完成。但是,有很多方法:

您可以测试“obj”(假设它是非空的)

您可以测试T的类型(实现A):

同样,您可以测试它是否为实现或子类:

    bool testAssign = typeof(ImplementA).IsAssignableFrom(typeof(T));

这不是一回事。例如,您可以调用:tettimplementtype(new ImplementA())实际上,编译器不允许您实例化TestImplementType。类型System.Object未实现InterfaceBase.Oops,未看到约束。但是,根点是sound-typeof(T)与obj.GetType()不同。您当然可以编写TestImplementType(新的ImplementA())。此外,这个例子不处理从ImplementA派生的类,这不是一回事。例如,您可以调用:tettimplementtype(new ImplementA())实际上,编译器不允许您实例化TestImplementType。类型System.Object未实现InterfaceBase.Oops,未看到约束。但是,根点是sound-typeof(T)与obj.GetType()不同。您当然可以编写TestImplementType(新的ImplementA())。此外,这个例子不处理从ImplementA派生的类,同样,这并不是说t派生自ImplementA,它只讨论obj的特定值。TestImplementType(new ImplementA())将在(根据实际问题)它不应该通过时通过。同样,这并不是说t派生自ImplementA,它只讨论obj的特定值。TestImplementType(new ImplementA())将在(根据实际问题)不应通过时通过。