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

10-07 22:49