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. Windsor Fluent註冊 - 程序集中的所有類型
- 7. 如何獲取程序集中的所有基類型?
- 8. 如何獲取引用程序集中的所有類型?
- 9. 使用Mono.Cecil查找類型層次結構程序集
- 10. 在程序集中查找數組
- 11. 在程序集中查找子串
- 12. 在PostgreSQL中查找所有組範圍的所有交集
- 13. 在當前F#程序集中找不到`BlockingQueueAgent`類型?
- 14. 在程序集中找到重複類型'master'
- 15. 在程序集中找不到上下文類型EF6
- 16. 在程序集中找不到任何上下文類型
- 17. SQL Server:無法在程序集中找到類型
- 18. 通過多態類型在Rails中查找所有內容?
- 19. 如何在Javadoc中查找返回類型的所有方法?
- 20. 在UIView中查找一個類型的所有控件
- 21. 使用WITH RECURSIVE查找所有複合類型組件類型
- 22. NDepend其他程序集/類型正在使用的框架程序集中的查詢方法/類型
- 23. 搜索所有兒童類型的程序集?
- 24. 爲程序集內的所有類型創建LinFu攔截器
- 25. 如何查找類中DateTime類型的所有屬性?
- 26. 查找集合的所有子集
- 27. 使用反射(DotNET)在程序集中查找所有名稱空間
- 28. 如何在程序集中查找所有出現的自定義屬性?
- 29. 在給定的程序集中查找不需要的類
- 30. 沒有類型的程序集實例
當然,如果你打算對這些類型和程序集做一些過濾,你會使用LINQ,對吧? ;) – 2011-01-14 15:54:51