如果您在不太关心性能的环境中,则反射可能是一种解决方案。但是,我建议不要使用反射,而是让Entity<T>
继承自非泛型类型的Entity
或IEntity
(请参见Silvermind的答案)。
对于反射,这些扩展方法应允许您针对typeof(Entity<>)
进行检查(可选布尔参数默认为检查基本类型):
static bool IsInstanceOfGenericType(this object item, Type @type, bool includeBaseTypes = true) {
return item.GetType().IsBasedOnGenericType(@type, includeBaseTypes);
}
static bool IsBasedOnGenericType(this Type t, Type @type, bool includeBaseTypes = true) {
return (t.IsGenericType && t.GetGenericTypeDefinition() == @type)
|| includeBaseTypes
&& (t.GetInterfaces().Any(i => IsBasedOnGenericType(i, @type))
|| (t.BaseType != null ? IsBasedOnGenericType(t.BaseType, @type) : false));
}
IsInstanceOfGenericType
方法可以这样使用:
class InheritingClass : Entity<string> { }
class Entity<T> : IEntity<T> { }
interface IEntity<T> { }
var item = new InheritingClass();
var item2 = new Entity<string>();
var item3 = new Entity<string>();
var item4 = new List<string>();
var item5 = new InheritingClass();
Console.WriteLine( "item: " + item.IsInstanceOfGenericType(typeof(Entity<>)) );
Console.WriteLine( "item2: " + item2.IsInstanceOfGenericType(typeof(Entity<>)) );
Console.WriteLine( "item3: " + item3.IsInstanceOfGenericType(typeof(IEntity<>)) );
Console.WriteLine( "item4: " + item4.IsInstanceOfGenericType(typeof(IEntity<>)) );
Console.WriteLine( "item5: " + item5.IsInstanceOfGenericType(typeof(Entity<>), false) );
item: True
item2: True
item3: True
item4: False
item5: False