2016-06-14 6 views
10

タイプがハコード文字列を使用せずに名前空間の一部であるかどうかを確認できますか?タイプがハードコードされた文字列を持たない名前空間に属しているかどうかを確認してください

私のような何かやろうとしている

:これらの例は、コンパイルされませんが、何のアイデアを与える必要があり

Type type = typeof(System.Data.Constraint); 
if(type.Namespace == "System.Data") 
{...} 

を避けるために

Type type = typeof(System.Data.Constraint); 
if(type.Namespace == System.Data.ToString()) 
{...} 

または

Type type = typeof(System.Data.Constraint); 
if(type.Namespace == System.Data) 
{...} 

を私は達成しようとしています。

nameof(System.Data)"Data"しか返さないため使用できません。

文字列に名前空間を持たなくても、名前空間の一部であるかどうかを調べる方法を探したいと思います。

+1

気になるものだけが好きですe。String.Join( "。"、nameof(System)、nameof(System.Data))。醜いが、まだまだあなたは何をしたいのですか? – Evk

+1

文字列のハードコーディングと(最終的に)名前空間のハードコーディングの違いは何ですか? –

+1

なぜ私はリフレクションで 'NamespaceInfo'クラスのようなものがないのか興味があります。私はあなたがここにそれを必要としているのを十分に理解していませんか?なぜ文字列はありませんか?あなたは 'type.Namespace'と比較したい情報をどこから得るのですか?コンパイル時にそれが分かっていれば、なぜ文字列はありませんか? –

答えて

4

例えば

static class Namespace 
{ 
    public static bool Contains<T>() 
     => typeof (T).Namespace == typeof (Namespace).Namespace; 
}  

:テストケースとして

namespace My.Inner 
{ 
    static class Namespace 
    { 
     public static bool Contains<T>() 
      => typeof (T).Namespace == typeof (Namespace).Namespace; 
    }  
} 

二つのタイプ:ここで

namespace My 
{ 
    class SomeTypeA { } 
} 

namespace My.Inner 
{ 
    class SomeTypeB { } 
} 

の使用されています

あなたがチェックを実行する場所の名前空間であります
Console.WriteLine(My.Inner.Namespace.Contains<SomeTypeA>()); // False 
Console.WriteLine(My.Inner.Namespace.Contains<SomeTypeB>()); // True 
+0

これはContainsメソッドを単一の名前空間に制限しているため、たとえば "System.Data"と "System.IO"の各クラスを複製する必要があります。 –

+0

@cFrozenDeath実際、それはかなり限られています。問題は、CLRに名前空間がなく、名前にドットが付いている型だけです。文字列の使用を避けなければならない場合、その名前空間に参照できるものを置く必要があります。 –

+0

私の答えは編集してください。文字列をハードコードしないとできるはずです。 –

4

あなたはこのような何か行うことができるはず:

static class Namespace 
{ 
    //generic 
    static bool Contains<T1, T2>() 
    { 
     return typeof(T1).Namespace == typeof(T2).Namespace; 
    } 
    //Non-generic 
    static bool Contains(Type type1, Type type2) 
    { 
     return type1.Namespace == type2.Namespace; 
    } 
} 

をし、それを使用します。@Theodoros Chatzigiannakisからのアイデアを使用して、また

static class Namespaces 
{ 
    //You would then need to add a prop for each namespace you want 
    static string Data = typeof(System.Data.Constrains).Namespace; 
} 

var namespaceA = typeof(System.Data.DataTable).Namespace 
if (namespaceA == Namespaces.Data) //true 
{ 
    //do something 
} 

を、あなたはこれをさらに一般化することができlike:

bool generic = Namespace.Contains<System.Data.CLASS1, System.Data.CLASS2>(); 
bool nonGeneric = Namespace.Contains(typeof(System.Data.CLASS1), typeof(System.Data.CLASS2)); 
+0

クラスが名前空間の一部であるかどうかをチェックしたいのですが、2つのクラスが同じ名前空間の一部であるかどうかは確認しません。それは私の質問から明らかだったかどうかわからない... – Dante

+0

@ダンテ私の編集を参照してください、多分それは良いですか? –

+0

お手数をおかけしていただきありがとうございます。まだ私が探していたものではありません。クラスが1つしかないので、クラスが特定の名前空間にあるかどうかを確認する必要があります。 2つのクラスの名前空間を比較しています。 – Dante

関連する問題