2016-06-14 8 views
10

È possibile verificare se un tipo fa parte di uno spazio dei nomi senza utilizzare stringhe harcoded?Verificare se un tipo appartiene a uno spazio dei nomi senza stringhe codificate

sto cercando di fare qualcosa di simile:

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

o

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

per evitare

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

Questi esempi non si compila, ma dovrebbe dare un'idea di ciò che Sto cercando di ottenere.

Non riesco a utilizzare nameof(System.Data) perché restituisce solo "Data".

Vorrei trovare un modo per verificare se una classe se parte di uno spazio dei nomi senza la necessità di avere tale spazio dei nomi in una stringa.

+1

L'unica cosa che viene in mente è qualcosa di simile e String.Join (".", nameof (System), nameof (System.Data)). Brutto ma ancora fare quello che vuoi :) – Evk

+1

Qual è la differenza tra l'hardcoding di una stringa e (eventualmente) l'hardcoding di uno spazio dei nomi? –

+1

Anche se sono interessato perché non esiste una cosa come una classe 'NamespaceInfo' nella riflessione. Non capisco appieno perché ... hai bisogno di questo qui? Perché nessuna corda? Da dove prendi le informazioni che vuoi confrontare con 'type.Namespace'? Se è noto al momento della compilazione, perché nessuna stringa? –

risposta

4

È possibile definire è nello spazio dei nomi in cui si desidera eseguire il controllo:

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

Ad esempio:

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

Due tipi come casi di test:

namespace My 
{ 
    class SomeTypeA { } 
} 

namespace My.Inner 
{ 
    class SomeTypeB { } 
} 

Qui è l'utilizzo:

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

Questo limita il metodo Contiene a un singolo spazio dei nomi, quindi dovresti replicare ogni classe ad esempio su "System.Data" e "System.IO" –

+0

@cFrozenDeath È vero, è piuttosto limitato. Il problema è che non ci sono spazi dei nomi nel CLR, solo i tipi con punti nei loro nomi. Quindi in un modo o nell'altro devi mettere qualcosa che puoi fare riferimento in quel namespace se * devi * evitare di usare una stringa. –

+0

Vedere la modifica sulla mia risposta, dovrebbe essere il meglio che possiamo fare senza stringhe di hardcoding. –

4

Si dovrebbe essere in grado di fare qualcosa di simile:

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 
} 

Inoltre, utilizzando l'idea da @Theodoros Chatzigiannakis, si potrebbe ulteriormente generalizzare questo:

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

e poi usarlo Mi piace:

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

Voglio verificare se una classe fa parte di uno spazio dei nomi, non se due classi fanno parte dello stesso spazio dei nomi. Non sono sicuro se fosse chiaro dalla mia domanda ... – Dante

+0

@Dante vedi la mia modifica, forse è meglio? –

+0

Grazie per l'aiuto e le idee. Ancora non quello che stavo cercando. Ho solo una classe, che voglio controllare se si trova in uno spazio dei nomi specifico. Stai confrontando gli spazi dei nomi di due classi. – Dante

Problemi correlati