在 C# 中,如何确定对象是否属于通用基类型
In C#, How do you find out whether an Object is of a Generic Base Type
作为编写代码生成工具(我的 classes 的客户端库)的一部分,我发现了一个有趣的问题。
我有一组 classes:
SomeClass : MyBaseClass<SomeClass>
SomeOtherClass : SomeOtherBaseClass
ClassC : SomeCompletelyOtherBaseClass<SomeClass>
MyBaseClass<T>
、SomeOtherBaseClass
和 SomeCompletelyOtherBaseClass<T>
都继承自同一个基础 class,但我对那个不感兴趣。
还有一个反射类型 (System.Type
) 作为我的代码的输入。
我想知道的是我的反射类型 - 它继承了这些通用基础中的哪一个 class。
我知道可以使用 IS 运算符,或 IsAssignableFrom
,但在这种情况下我不知道泛型是什么。
所以我不能只说 myType.IsAssignableFrom(MyBaseClass<T>)
,因为我不知道 T
,我只有 MyBaseClass
名字。
我想从中得到的是 - 能够在 switch/case 语句中使用它,说对于从 MyBaseClass 继承的所有 classes 这样做,对于从 SomeCompletelyOtherBaseClass 继承的所有这样做。
有什么想法吗?
不过,我需要确定 T
稍后在线,因此欢迎任何其他输入。
简单模型:
namespace Program {
class MyGeneric<T> { }
class MyDerived : MyGeneric<String> { }
class Program {
public static void Main() {
MyDerived item = new MyDerived ();
Boolean isIt = typeof(MyGeneric<>).BaseType.IsAssignableFrom (item.GetType());
Console.WriteLine (isIt); // Output: "True"
foreach (Type type in item.GetType().BaseType.GetGenericArguments())
Console.WriteLine(type.Name);
}
}
}
作为编写代码生成工具(我的 classes 的客户端库)的一部分,我发现了一个有趣的问题。
我有一组 classes:
SomeClass : MyBaseClass<SomeClass>
SomeOtherClass : SomeOtherBaseClass
ClassC : SomeCompletelyOtherBaseClass<SomeClass>
MyBaseClass<T>
、SomeOtherBaseClass
和 SomeCompletelyOtherBaseClass<T>
都继承自同一个基础 class,但我对那个不感兴趣。
还有一个反射类型 (System.Type
) 作为我的代码的输入。
我想知道的是我的反射类型 - 它继承了这些通用基础中的哪一个 class。
我知道可以使用 IS 运算符,或 IsAssignableFrom
,但在这种情况下我不知道泛型是什么。
所以我不能只说 myType.IsAssignableFrom(MyBaseClass<T>)
,因为我不知道 T
,我只有 MyBaseClass
名字。
我想从中得到的是 - 能够在 switch/case 语句中使用它,说对于从 MyBaseClass 继承的所有 classes 这样做,对于从 SomeCompletelyOtherBaseClass 继承的所有这样做。
有什么想法吗?
不过,我需要确定 T
稍后在线,因此欢迎任何其他输入。
简单模型:
namespace Program {
class MyGeneric<T> { }
class MyDerived : MyGeneric<String> { }
class Program {
public static void Main() {
MyDerived item = new MyDerived ();
Boolean isIt = typeof(MyGeneric<>).BaseType.IsAssignableFrom (item.GetType());
Console.WriteLine (isIt); // Output: "True"
foreach (Type type in item.GetType().BaseType.GetGenericArguments())
Console.WriteLine(type.Name);
}
}
}