如何使用C#中的反射查找实现泛型抽象类的所有类?
发布时间:2020-12-15 19:29:06 所属栏目:百科 来源:网络整理
导读:我有一个看起来像这样的c#类 public abstract class ListenerT where T : Event{ public abstract void Handle(T _event);} 我将这个类扩展为这样的东西 public class SendWelcomeEmail : ListenerUserWasCreated{ public override void Handle(UserWasCreat
我有一个看起来像这样的c#类
public abstract class Listener<T> where T : Event { public abstract void Handle(T _event); } 我将这个类扩展为这样的东西 public class SendWelcomeEmail : Listener<UserWasCreated> { public override void Handle(UserWasCreated _event) { //... } } 我需要使用反射来查找扩展Listener的所有类<>基类. 我尝试了以下内容 var listeners = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(assembly => assembly.GetTypes()) .Where(x => x.IsClass && !x.IsInterface) .Where(listener => !listener.IsAbstract && listener.IsGenericType && listener.GetGenericTypeDefinition() == typeof(Listener<>)) .ToList(); 但这并不会带来任何回报.此条件一直返回false listener.GetGenericTypeDefinition()== typeof(Listener<>) 如何正确查找扩展Listener<>的所有类?基类? 解决方法
首先构建您需要的基础架构:在工具箱中放入更多工具,然后使用这些工具.
您想列出类型的所有基类型,因此列出类型的所有基类型: static class Extensions { public static IEnumerable<Type> BaseTypes(this Type type) { Type t = type; while (true) { t = t.BaseType; if (t == null) break; yield return t; } } } 现在我们的工具箱中有一个有用的工具. 我们有一个类型.我们想知道它的任何基类型是否都有.因此我们应该使用Any: static bool AnyBaseType(this Type type,Func<Type,bool> predicate) => type.BaseTypes().Any(predicate); 现在我们有另一个有用的工具. 我们想知道特定类型是否是特定的泛型: static bool IsParticularGeneric(this Type type,Type generic) => type.IsGenericType && type.GetGenericTypeDefinition() == generic; 我们想知道某个特定类型是否是一个监听器: static bool IsListener(Type type) => type.IsParticularGeneric(typeof(Listener<>)); 现在我们拥有了我们需要的工具. var listeners = from assembly in AppDomain.CurrentDomain.GetAssemblies() from type in assembly.GetTypes() where type.AnyBaseType(IsListener) select type; 当您构建一次需要的工具时,查看查询读取的容易程度如何?我们想知道什么?如果任何基类型是监听器.那么代码如何读取? “任何基类型都是监听器的类型” – 代码读起来就像它的作用描述. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |