假设我有以下类(class):
public class General<T> { }
我想知道一个对象是否属于那种类型。
我知道我可以使用反射来确定对象是否属于 Type.GetGenericTypeDefinition
的泛型类型,但我想避免这种情况。
是否可以做类似 obj is General<T>
的事情? , 或 obj.GetType().IsAssignableFrom(typeof(General<T>))
?
我很惊讶我找不到类似的问题,尽管我可能在搜索中使用了错误的关键字。
最佳答案
你可以这样做:
var obj = new General<int>();
var type = obj.GetType();
var isGeneral =
(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(General<>)) ||
type.GetBaseTypes().Any(x => x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(General<>));
其中GetBaseTypes
是下面的扩展方法:
public static IEnumerable<Type> GetBaseTypes(this Type type)
{
if (type.BaseType == null) return type.GetInterfaces();
return new []{type}.Concat(
Enumerable.Repeat(type.BaseType, 1)
.Concat(type.GetInterfaces())
.Concat(type.GetInterfaces().SelectMany<Type, Type>(GetBaseTypes))
.Concat(type.BaseType.GetBaseTypes()));
}
归功于 Slacks answer
关于c# - 检查对象是否为 C# 中的非特定泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687264/