47
A
回答
79
有两个步骤来实现:
- 的
AppDomain.CurrentDomain.GetAssemblies()
让你在当前的应用程序域中加载的所有程序集。 Assembly
类提供了一个GetTypes()
方法来检索该特定程序集内的所有类型。
因此你的代码可能是这样的:
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (Type t in a.GetTypes())
{
// ... do something with 't' ...
}
}
为了寻找特定类型(例如实现给定的接口,从一个共同的祖先或任何继承),你必须筛选出的结果。如果您需要在应用程序的多个位置执行该操作,建立一个提供不同选项的助手类是一个不错的主意。例如,我通常应用名称空间前缀过滤器,接口实现过滤器和继承过滤器。
IEnumerable<Type> types =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
select t;
foreach(Type t in types)
{
...
}
26
易。因此,您需要致电GetExportedTypes()但除此之外,还可以抛出ReflectionTypeLoadException。以下代码处理这些情况。
public static IEnumerable<Type> FindTypes(Func<Type, bool> predicate)
{
if (predicate == null)
throw new ArgumentNullException(nameof(predicate));
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (!assembly.IsDynamic)
{
Type[] exportedTypes = null;
try
{
exportedTypes = assembly.GetExportedTypes();
}
catch (ReflectionTypeLoadException e)
{
exportedTypes = e.Types;
}
if (exportedTypes != null)
{
foreach (var type in exportedTypes)
{
if (predicate(type))
yield return type;
}
}
}
}
}
19
LINQ的解决方案,看是否装配是动态的:
/// <summary>
/// Looks in all loaded assemblies for the given type.
/// </summary>
/// <param name="fullName">
/// The full name of the type.
/// </param>
/// <returns>
/// The <see cref="Type"/> found; null if not found.
/// </returns>
private static Type FindType(string fullName)
{
return
AppDomain.CurrentDomain.GetAssemblies()
.Where(a => !a.IsDynamic)
.SelectMany(a => a.GetTypes())
.FirstOrDefault(t => t.FullName.Equals(fullName));
}
4
最常见的是你只在那些从外部可见的组件兴趣使用LINQ
相关问题
- 1. ASP.NET Core在所有程序集中查找所有类的类型
- 2. 帮助System.Web.Compilation.BuildManager在未引用的程序集中查找类型
- 3. 如何在.net中查找程序集中特定接口的所有类.net
- 4. 在TFS中查找所有项目引用特定程序集
- 5. 枚举宏中的程序集中的所有类型
- 6. 如何获取引用程序集中的所有类型?
- 7. Windsor Fluent注册 - 程序集中的所有类型
- 8. 如何获取程序集中的所有基类型?
- 9. 使用Mono.Cecil查找类型层次结构程序集
- 10. 在程序集中查找数组
- 11. 在程序集中查找子串
- 12. 在程序集中找到重复类型'master'
- 13. 在当前F#程序集中找不到`BlockingQueueAgent`类型?
- 14. 在UIView中查找一个类型的所有控件
- 15. 通过多态类型在Rails中查找所有内容?
- 16. 如何查找类中DateTime类型的所有属性?
- 17. NDepend其他程序集/类型正在使用的框架程序集中的查询方法/类型
- 18. 查找集合的所有子集
- 19. 搜索所有儿童类型的程序集?
- 20. 为程序集内的所有类型创建LinFu拦截器
- 21. 如何在程序集中查找所有出现的自定义属性?
- 22. 没有类型的程序集实例
- 23. 查找Microsoft.Crm程序集
- 24. 查找程序集中特定类所用的近似磁盘空间
- 25. 在Prolog程序中查找所有自然数解决方案
- 26. ThinkTecture.IdentityModel“类型'System.IdentityModel.Tokens.SecurityToken'在没有引用的程序集中定义
- 27. Silverlight:查找布局中的所有类型控件
- 28. 查找数据库中指定类型的所有列
- 29. 查找给定包中的所有类
- 30. 查找ClearCase分支类型的子集
当然,如果你打算对这些类型和程序集做一些过滤,你会使用LINQ,对吧? ;) – 2011-01-14 15:54:51