実行時にロードされたすべてのアセンブリのアクティブなAppDomainを「スキャン」し、それらのアセンブリで使用可能な一意の名前空間のリストを取得する必要があります。.NETはそれをサポートしていますか?
コードが動的になるように、コードは実行時に実行する必要があります。
C#でコーディングを始めたばかりなので、どこから始めればよいかわからないので、助けていただければ幸いです。
実行時にロードされたすべてのアセンブリのアクティブなAppDomainを「スキャン」し、それらのアセンブリで使用可能な一意の名前空間のリストを取得する必要があります。.NETはそれをサポートしていますか?
コードが動的になるように、コードは実行時に実行する必要があります。
C#でコーディングを始めたばかりなので、どこから始めればよいかわからないので、助けていただければ幸いです。
AppDomain
(AppDomain.CurrentDomain
おそらく)から開始し、を呼び出しますGetAssemblies
。各アセンブリで、それが定義する型を繰り返し処理し、それぞれがどの名前空間にあるかを追跡します。
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();
実際のところ、数日前にそれを可能にするコードを書きました。
このクラスを使用します:
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);
楽しみ!