如何使用C#中的反射查找实现泛型抽象类的所有类?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用C#中的反射查找实现泛型抽象类的所有类?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1909字,纯文字阅读大概需要3分钟。
内容图文
![如何使用C#中的反射查找实现泛型抽象类的所有类?](/upload/InfoBanner/zyjiaocheng/762/6a2025082aa34dd78a12580e2bc2fed6.jpg)
我有一个看起来像这样的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;
当您构建一次需要的工具时,查看查询读取的容易程度如何?我们想知道什么?如果任何基类型是监听器.那么代码如何读取? “任何基类型都是监听器的类型” – 代码读起来就像它的作用描述.
内容总结
以上是互联网集市为您收集整理的如何使用C#中的反射查找实现泛型抽象类的所有类?全部内容,希望文章能够帮你解决如何使用C#中的反射查找实现泛型抽象类的所有类?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。