我需要在运行时为所有加载的程序集“扫描”活动AppDomain并获得这些程序集中可用的唯一名称空间的列表,.NET是否支持这些名称空间?获取AppDomain中所有可用名称空间的列表
代码必须在运行时执行,以便代码是动态的。
我刚刚开始在C#中编写代码,所以我有点不确定从哪里开始,所以任何帮助将不胜感激。
我需要在运行时为所有加载的程序集“扫描”活动AppDomain并获得这些程序集中可用的唯一名称空间的列表,.NET是否支持这些名称空间?获取AppDomain中所有可用名称空间的列表
代码必须在运行时执行,以便代码是动态的。
我刚刚开始在C#中编写代码,所以我有点不确定从哪里开始,所以任何帮助将不胜感激。
作为事事实上,我写了一些代码,可以让你在几天前做到这一点。
使用此类:
public class NSScanner
{
public static List<Type> GetLoadedTypes(AppDomain appDomain)
{
return _getLoadedTypes(appDomain);
}
public static List<Type> GetPublicLoadedTypes(AppDomain appDomain)
{
return _getLoadedTypes(appDomain, true);
}
public static List<string> GetUniqueNamespaces(IEnumerable<Type> types)
{
var uniqueNamespaces = new ConcurrentBag<string>();
Parallel.ForEach(types, type =>
{
if (!uniqueNamespaces.Contains(type.Namespace) && !string.IsNullOrEmpty(type.Namespace))
uniqueNamespaces.Add(type.Namespace);
});
var sortedList = uniqueNamespaces.OrderBy(o => o).ToList();
return sortedList;
}
private static List<Type> _getLoadedTypes(AppDomain appDomain, bool onlyPublicTypes = false)
{
var loadedAssemblies = appDomain.GetAssemblies();
var loadedTypes = new List<Type>();
Parallel.ForEach(loadedAssemblies, asm =>
{
Type[] asmTypes;
if (onlyPublicTypes)
asmTypes = asm.GetExportedTypes();
else
asmTypes = asm.GetTypes();
loadedTypes.AddRange(asmTypes);
});
return loadedTypes;
}
}
使用:
var publicLoadedTypes = NSScanner.GetPublicLoadedTypes(AppDomain.CurrentDomain);
var namespaces = NSScanner.GetUniqueNamespaces(publicLoadedTypes);
享受!
这正是我需要的,谢谢! – jjdev80 2013-02-20 09:48:28
从AppDomain
(AppDomain.CurrentDomain
也许)开始并致电GetAssemblies
。在每个装配遍历它定义了types,跟踪其中namespace每一个都是在
由于是多么容易与LINQ做到这一点考虑这样一个例子:
var namespaces = AppDomain.CurrentDomain
.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Select(t => t.Namespace)
.Distinct()
// optionally .OrderBy(ns => ns) here to get sorted results
.ToList();
谢谢vm :) – jjdev80 2013-02-20 10:00:41
如果您刚开始学习C#,稍后保存反射和其他高级内容。我的意见当然。 – gdoron 2013-02-20 09:42:33
过去20年来我一直在使用c/C++和assembly,所以我不是一个完整的noob,需要从某处开始:) – jjdev80 2013-02-20 09:45:28