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())将在(根据实际问题)不应通过时通过。