说我有以下类(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