C# 泛型类型的反射子类
在以下场景中:C# 泛型类型的反射子类,c#,generics,reflection,C#,Generics,Reflection,在以下场景中: public class A<T> { } public class B : A<AClass> { } 公共类A{} 公共B类:A{} 是否可以在不指定AClass(泛型参数)的情况下确定B是否是a的子类?例如: typeof(B).IsSubclassOf(A) 是的,但您必须自己完成层次结构: var instance = new B(); Type t = instance.GetType(); bool isA = false; whil
public class A<T> { }
public class B : A<AClass> { }
公共类A{}
公共B类:A{}
是否可以在不指定AClass(泛型参数)的情况下确定B是否是a的子类?例如:
typeof(B).IsSubclassOf(A)
是的,但您必须自己完成层次结构:
var instance = new B();
Type t = instance.GetType();
bool isA = false;
while(t != typeof(object))
{
if(t.IsGenericType && t.GetGenericTypeDefinition() == typeof(A<>))
{
isA = true;
break;
}
else
{
t = t.BaseType;
}
}
var实例=新的B();
类型t=instance.GetType();
bool-isA=false;
while(t!=类型(对象))
{
if(t.IsGenericType&&t.GetGenericTypeDefinition()==typeof(A))
{
isA=真;
打破
}
其他的
{
t=t.BaseType;
}
}
找到了一个简单的方法:如果(B.GetType().BaseType.Name==typeof(a).Name)
代码和问题对我来说都没有意义。该代码不会编译,因此询问反射的作用是不可能的。泛型类和从它继承的任何东西都需要隐式或显式的类型参数(即t
)。据我所知,你不能通过子类化来解决这个问题。试图这样做根本没有意义。你能更好地解释你的目标吗?当你将B
定义为继承自a
,而a
不是派生自任何其他类时,B
怎么可能是a
的子类呢?@EricLippert修复了代码并添加了更多信息。@Yuck谢谢注意。我修复了这个问题。Works还验证了整个继承层次结构,而不仅仅是基类型(我只考虑了基类型)。谢谢两个问题:1)这只“解决”了直接的基类场景,而不是更一般的任何基类场景;2)Name
属性不是类型的唯一标识符。实际上,在某些情况下,甚至完全限定的FullName
属性也不是。这不是一个有用的答案,特别是考虑到事实上这里已经有了一个正确的答案。
var instance = new B();
Type t = instance.GetType();
bool isA = false;
while(t != typeof(object))
{
if(t.IsGenericType && t.GetGenericTypeDefinition() == typeof(A<>))
{
isA = true;
break;
}
else
{
t = t.BaseType;
}
}