2016-06-14 7 views
10

Ist es möglich, zu überprüfen, ob ein Typ Teil eines Namespace ist, ohne harcodierte Strings zu verwenden?Prüfen, ob ein Typ zu einem Namespace ohne hardcoded Strings gehört

Ich versuche, so etwas wie zu tun:

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

oder

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

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

Diese Beispiele kompilieren nicht zu vermeiden, aber sollte eine Vorstellung davon geben, was Ich versuche es zu erreichen.

Ich kann nameof(System.Data) nicht verwenden, weil es nur "Data" zurückgibt.

Ich würde gerne einen Weg finden, um zu überprüfen, ob eine Klasse, wenn Teil eines Namespace ohne den Namespace in einer Zeichenfolge haben.

+1

Nur etwas, das in den Sinn kommt, ist etwas like e String.Join (".", Name von (System), Name von (System.Data)). Hässlich, aber immer noch tun, was Sie wollen :) – Evk

+1

Was ist der Unterschied zwischen Hardcoding eine Zeichenfolge und (schließlich) Hardcoding ein Namespace? –

+1

Obwohl ich interessiert bin, warum es so etwas wie eine 'NamespaceInfo'-Klasse in der Reflexion nicht gibt. Ich verstehe nicht ganz, warum du das hier brauchst? Warum keine Schnur? Woher bekommen Sie die Informationen, die Sie mit "type.Namespace" vergleichen möchten? Wenn es zur Kompilierzeit bekannt ist, warum keine Zeichenfolge? –

Antwort

4

Sie können th definieren im Namensraum ist, wo Sie die Prüfung durchführen möchten:

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

Zum Beispiel:

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

Zwei Arten als Testfälle:

namespace My 
{ 
    class SomeTypeA { } 
} 

namespace My.Inner 
{ 
    class SomeTypeB { } 
} 

Hier ist die Nutzung:

Console.WriteLine(My.Inner.Namespace.Contains<SomeTypeA>()); // False 
Console.WriteLine(My.Inner.Namespace.Contains<SomeTypeB>()); // True 
+0

Dies beschränkt die Contains-Methode auf einen einzelnen Namespace, so dass Sie jede Klasse replizieren müssen, zum Beispiel bei "System.Data" und "System.IO" –

+0

@cFrozenDeath Wahr, es ist ziemlich begrenzt. Das Problem ist, dass in der CLR keine Namespaces vorhanden sind, sondern nur Typen mit Punkten in ihren Namen. Auf die eine oder andere Weise müssen Sie etwas einfügen, auf das Sie in diesem Namespace verweisen können, wenn Sie * eine Zeichenfolge * vermeiden müssen. –

+0

Siehe die Bearbeitung meiner Antwort, es sollte das Beste sein, was wir ohne Hardcoding Strings machen können. –

4

Sie sollten in der Lage sein, so etwas zu tun:

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 
} 

Auch mit der Idee von @Theodoros Chatzigiannakis, könnten Sie dies weiter verallgemeinern:

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; 
    } 
} 

und dann verwenden, wie:

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

Ich möchte überprüfen, ob eine Klasse Teil eines Namespace ist, nicht, wenn zwei Klassen Teil desselben Namespace sind. Nicht sicher, ob es von meiner Frage klar war .... – Dante

+0

@Dante sehe meine Bearbeitung, vielleicht ist das besser? –

+0

Danke für die Hilfe und Ideen. Immer noch nicht das, wonach ich gesucht habe. Ich habe nur eine Klasse, die ich überprüfen möchte, ob sie in einem bestimmten Namensraum ist. Sie vergleichen Namespaces zweier Klassen. – Dante

Verwandte Themen