C#でリフレクションして名前空間のすべてのクラスを取得するにはどうすればよいですか?リフレクションを介して名前空間にすべての型を取得する
答えて
using System.Reflection;
using System.Collections.Generic;
//...
static List<string> GetClasses(string nameSpace)
{
Assembly asm = Assembly.GetExecutingAssembly();
List<string> namespacelist = new List<string>();
List<string> classlist = new List<string>();
foreach (Type type in asm.GetTypes())
{
if (type.Namespace == nameSpace)
namespacelist.Add(type.Name);
}
foreach (string classname in namespacelist)
classlist.Add(classname);
return classlist;
}
名前空間が複数のアセンブリを埋めることができますので、あなたは、名前空間内のすべての種類を取得することができませんが、アセンブリ内のすべてのクラスを取得し、彼らはその名前空間に属しているかどうかを確認することができます。
Assembly.GetTypes()
がローカルアセンブリで動作するか、アセンブリを最初にロードしてからGetTypes()
を呼び出します。
+1です。 AppDomain.CurrentDomain.GetAssembliesが役に立ちます。 – nawfal
...それらをループし、名前空間と一致しないものを除外します。 –
次のコードは、現在のアセンブリで定義されているnamespace
に指定されたクラスの名前を出力します。
他の人が指摘したように、ネームスペースは異なるモジュール間に散在することがあります。そのため、まずアセンブリのリストを取得する必要があります。
string nspace = "...";
var q = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsClass && t.Namespace == nspace
select t;
q.ToList().ForEach(t => Console.WriteLine(t.Name));
名前空間は、実際にはランタイムの設計においてはむしろ受動的であり、主に組織ツールとして機能します。 .NETの型のフルネームは、NamespaceとClass/Enum/Etcで構成されます。組み合わせる。特定のアセンブリだけを実行したい場合は、アセンブリによって返された型をループするだけです。 GetExportedTypes()タイプの値をチェックしています。 Namespace。現在のAppDomainに読み込まれたすべてのアセンブリを処理しようとしている場合は、AppDomain.CurrentDomainを使用する必要があります。
// Setup event handler to resolve assemblies
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
Assembly a = System.Reflection.Assembly.ReflectionOnlyLoadFrom(filename);
a.GetTypes();
// process types here
// method later in the class:
static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}
他のアセンブリで定義されたロードタイプを支援する必要がありますタイプのいずれかが別のアセンブリ内のタイプをサブクラスを場合GetAssemblies()
//a simple combined code snippet
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace MustHaveAttributes
{
class Program
{
static void Main (string[] args)
{
Console.WriteLine (" START ");
// what is in the assembly
Assembly a = Assembly.Load ("MustHaveAttributes");
Type[] types = a.GetTypes();
foreach (Type t in types)
{
Console.WriteLine ("Type is {0}", t);
}
Console.WriteLine (
"{0} types found", types.Length);
#region Linq
//#region Action
//string @namespace = "MustHaveAttributes";
//var q = from t in Assembly.GetExecutingAssembly().GetTypes()
// where t.IsClass && t.Namespace == @namespace
// select t;
//q.ToList().ForEach (t => Console.WriteLine (t.Name));
//#endregion Action
#endregion
Console.ReadLine();
Console.WriteLine (" HIT A KEY TO EXIT ");
Console.WriteLine (" END ");
}
} //eof Program
class ClassOne
{
} //eof class
class ClassTwo
{
} //eof class
[System.AttributeUsage (System.AttributeTargets.Class |
System.AttributeTargets.Struct, AllowMultiple = true)]
public class AttributeClass : System.Attribute
{
public string MustHaveDescription { get; set; }
public string MusHaveVersion { get; set; }
public AttributeClass (string mustHaveDescription, string mustHaveVersion)
{
MustHaveDescription = mustHaveDescription;
MusHaveVersion = mustHaveVersion;
}
} //eof class
} //eof namespace
'MustHaveAttributes'という名前の'AttributeClass'とは何ですか?クラスに属性があるかどうかをテストすることは何も見ません。これは参考になるよりも混乱します。 – ProfK
が、使用して拡張メソッドは:FlySwatが言うように
string @namespace = "...";
var types = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.IsClass && t.Namespace == @namespace)
.ToList();
types.ForEach(t => Console.WriteLine(t.Name));
、あなたは(例えばSystem.Collections.Generic
用)複数のアセンブリにまたがる同じ名前空間を持つことができます。これらのアセンブリがまだロードされていない場合は、それらをすべてロードする必要があります。だから完全な答え:
AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(t => t.GetTypes())
.Where(t => t.IsClass && t.Namespace == @namespace)
これは、他のドメインのクラスを必要としない限り動作します。すべてのドメインのリストを取得するには、this link.
はうまく動作します - 私は "&& t.Namespace == @ namespace'"を削除しようとしました - どちらのofcauseが** all ** .netアセンブリを与えました:-) – Netsi1964
'&& tを削除するとNetsi1964。Namespace == @ namespace' .netを含む*すべてのアセンブリ*の*クラス*を取得します。 'GetAssemblies'はすべてのアセンブリを提供し、' GetAssemblies()。SelectMany(t => t.GetTypes()) 'はすべてのアセンブリからすべての型(クラス、構造体など)を与えます。 – nawfal
に従うだけで1行の名前空間名の一部ですべてのクラスを取得します。具体的な組み立てのため
var allClasses = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.Namespace != null && a.Namespace.Contains(@"..your namespace...")).ToList();
、クラス名フィルタを持つ:
var asm = Assembly.Load("Some.Assembly.Name");
var nameSpace = "Some.Namespace.Name";
var classes = asm.GetTypes().Where(p =>
p.Namespace == nameSpace &&
p.Name.Contains("ClassNameFilter")
).ToList();
注:プロジェクトが参照する必要があります
非常に簡単組立
Type[] types = Assembly.Load(new AssemblyName("mynamespace.folder")).GetTypes();
foreach (var item in types)
{
}
- 1. リフレクションを介してPHP 5.6でプロパティクラスの名前空間を取得する方法
- 2. 名前空間内のすべての名前空間を再帰的に取得する方法
- 3. XPathを使用してデフォルトの名前空間(名前空間接頭辞なし)を取得する
- 4. 取得名前空間
- 5. 名前空間(またはフレームワーク名)を持つ文字列としてSwift型名を取得する方法
- 6. XML - 名前空間のタグ名を取得するには?
- 7. 名前空間と非名前空間XMLを混在させて値を取得する方法
- 8. C#Roslynコンパイラ - IdentifierNameSyntaxから型の名前空間を取得するには?
- 9. リフレクションを使用してSerializableattriubteですべての拡張型を取得
- 10. Javaリフレクション、ジェネリッククラスパラメータの名前を取得
- 11. すべての名前空間とプラグインをリストする(Octobercms)
- 12. Golangのリフレクションを使用して関数の名前を取得する
- 13. 匿名名前空間はすべての名前空間を囲んでいますか?
- 14. 名前空間で同じタグ名のすべての要素を取得する方法は?
- 15. ProjectItemの名前空間の取得
- 16. Clojureでvarの名前空間を取得するには?
- 17. Python:現在の名前空間にあるすべてのオブジェクトのサイズを取得する方法は?
- 18. 型または名前空間名「ServiceBus」名前空間に存在していない「マイクロソフト」
- 19. ロードされたアセンブリのルート名前空間(アセンブリ名前空間)を取得します
- 20. 呼び出し側のインスタンスを取得する(リフレクションを介して)
- 21. 型または名前空間の名前Webが名前空間のシステムに存在しません
- 22. MySQLからすべての名前を取得するには?
- 23. xpathと名前空間を持つすべての兄弟ノードを取得する
- 24. リフレクションAPIを使用してフィールド名と値を取得する
- 25. リフレクションを使用して実行アセンブリ名を取得する
- 26. リフレクションを使用して引数名を取得する方法
- 27. リフレクションを介してオブジェクト内のフィールドとその値を取得するJava
- 28. ディレクトリから特定の名前空間のすべてのdllを取得する
- 29. 名前空間に型または名前空間の名前が存在しません
- 30. すべてのクラスファイルに名前空間のセットを追加しますか?
あなたの質問を編集することはできますか?サブテキストの質問はC#のネームスペースよりもコミュニケートです – Gishu
[ここ](http:// stackoverflow。com/questions/949246/how-to-get-all-classes-within-namespace)を参照してください。 2つの異なるサンプルがあります。 –