[英]Foreach loop on a generic list in a class which inherits from a abstract class
[英]Find classes which inherits from a generic class using reflection
我需要一种方法来过滤程序集,以获取从通用类继承的所有类。 我发现了一些帖子,但它们最像是如何检查继承性(例如, 如何检查一个类是否继承了另一个类而不实例化它?以及如何检查一个类是否从通用类派生 )。 但是这些帖子对我没有帮助。
我所有的类都继承自一个特定的类,即BaseRepository<T>
,但是有些类可以继承自InterventionBaseRepository<T>
(它也继承自BaseRepository<T>
)。 我需要找到他们。 到目前为止,这是我的代码:
var q = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsClass &&
(t.Namespace != null &&
t.Namespace.StartsWith("AgroWeb.Core.Data.Repository"))
select t;
因此,简而言之,上面的查询按名称空间获取了我所有的类,我需要在其中查找那些从InterventionBaseRepository<T>
继承的类。
必须找到的类签名的示例:
public class CityRepository : InterventionBaseRepository<City>, ICityRepository
以及InterventionBaseRepository
声明:
public class InterventionBaseRepository<T> : BaseRepository<T>
where T : Entity
我尝试使用IsAssignableFrom()
如上面查询中链接的那些帖子中所述:
t.IsAssignableFrom(typeof(InterventionBaseRepository<Entity>))
这是因为您要检查的是实体而不是城市。 如果要使用协变泛型参数,请为InterventionBaseRepository指定一个接口,如下所示:
public interface IInterventionBaseRepository<out T> { }
然后让您的InterventionBaseRepository实现它。 现在,可以将Repo <City>视为Repo <Entity>。
所以:
public class InterventionBaseRepository<T> : BaseRepository<T>, IInterventionBaseRepository<T>
where T : Entity
{
}
从这篇文章 :
CityRepository value = new CityRepository();
Type type = value.GetType();
Type baseType = type.BaseType;
if (baseType.IsGenericType)
{
Console.WriteLine(baseType.Name + " is generic type");
Type itemType = baseType.GetGenericArguments()[0];
Console.WriteLine("Generic argument: " + itemType.Name);
Type genericType = baseType.GetGenericTypeDefinition();
Console.WriteLine("Generic type: " + genericType.Name);
Console.WriteLine("Generic base type: " + genericType.BaseType.Name);
}
if (type.IsAssignableToGenericType(typeof(BaseRepository<>)))
{
Console.WriteLine("IsAssignableToGenericType: BaseRepository<>");
}
if (type.IsAssignableToGenericType(typeof(InterventionBaseRepository<>)))
{
Console.WriteLine("IsAssignableToGenericType: InterventionBaseRepository<>");
}
和:
public static class Utils
{
public static bool IsAssignableToGenericType(this Type givenType, Type genericType)
{
var interfaceTypes = givenType.GetInterfaces();
foreach (var it in interfaceTypes)
{
if (it.IsGenericType && it.GetGenericTypeDefinition() == genericType)
return true;
}
if (givenType.IsGenericType && givenType.GetGenericTypeDefinition() == genericType)
return true;
Type baseType = givenType.BaseType;
if (baseType == null) return false;
return IsAssignableToGenericType(baseType, genericType);
}
}
输出:
InterventionBaseRepository`1 is generic type
Generic argument: City
Generic type: InterventionBaseRepository`1
Generic base type: BaseRepository`1
IsAssignableToGenericType: BaseRepository<>
IsAssignableToGenericType: InterventionBaseRepository<>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.