2011-02-05 19 views
4

簡単に言えば、プロジェクト内のすべての名前空間を再帰的に使い、先に見つかったすべての名前空間でクラスを利用できます。名前空間内のすべての名前空間を再帰的に取得する方法

var namespaces = assembly.GetTypes() 
        .Select(ns => ns.Namespace); 

この部分を先に使用して、文字列形式の名前空間を取得しています。 しかし、私は基本的な名前空間も知っている必要があります。

答えて

4

それはあなたのようなに聞こえるかもしれませんクラスに名前空間からLookupをしたい:

var lookup = assembly.GetTypes().ToLookup(t => t.Namespace); 

または代わりに(と非常に似た)あなたはGroupByを使用することができます。

var groups = assembly.GetTypes().GroupBy(t => t.Namespace); 

例えば:

var groups = assembly.GetTypes() 
        .Where(t => t.IsClass) // Only include classes 
        .GroupBy(t => t.Namespace); 
foreach (var group in groups) 
{ 
    Console.WriteLine("Namespace: {0}", group.Key); 
    foreach (var type in group) 
    { 
     Console.WriteLine(" {0}", t.Name); 
    } 
} 

それはあなたが何をしているのかどうかは完全にはっきりしていません。それは各名前空間のクラスを取得しますが、それが本当にあなたが探しているものかどうかはわかりません。心に留めする

2点:

  • ない本当にフォーム階層を、限りCLRが懸念されるようにしてください。この
  • 名前空間についての再帰的なものは何もありません。 「根底にある」名前空間などはありません。 C#言語自体にはにいくつかのルールがありますが、CLRに関する限り、「親」名前空間などはありません。

あなた本当には、あなたのようなものを使用することができます「Foo.Bar」と「フー」に「Foo.Bar.Baz」から行ってみたい場合:

while (true) 
{ 
    Console.WriteLine(ns); 
    int index = ns.LastIndexOf('.'); 
    if (index == -1) 
    { 
     break; 
    } 
    ns = ns.Substring(0, index); 
} 
+0

@ジョンスキートを:ありがとうあなたはそんなに。特に.Netの知識は素晴らしいです。私はあなたの学生になりたいです。 :) – Prakash

+0

@ジョンスケート:私はまた、反射についてもっと知りたいです。私はリフレクションを早く過小評価した。だから私はこれについてもっと知りたい。このトピックに関する実験的な知識のほとんどを得ることができる方法はありますか?私は一つの方法を知っています。 :)もし何かの情報源があるなら、私に示唆してください。 – Prakash

+0

@Prakash:正直なところ、試してみるのは本当に良い選択です。 TypeとMethodInfoのようなもののすべてのメンバーを見て、それらが役に立つかもしれない場所を考えてください。 –