2016-06-14 12 views
10

Bir türün, harelenmiş dizeleri kullanmadan bir ad alanının parçası olup olmadığını kontrol etmek mümkün mü? Ben böyle bir şey yapmak çalışıyorumBir türün kodlanmış dizeler olmadan bir ad alanına ait olup olmadığını kontrol edin

:

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

Bu örnekler derlemek yok önlemek için

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

veya

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

ama bir fikir vermek gerektiğini Başarmaya çalışıyorum.

nameof(System.Data) kullanamazsınız, çünkü yalnızca "Data" döndürür.

Bir ad alanı parçası, bir dize içinde bu ad alanına sahip olmak gerekmeden bir sınıf olup olmadığını kontrol etmek için bir yol bulmak istiyorum.

+1

Akla gelen tek şey şudur d String.Join (".", (System), (System.Data)). Çirkin ama yine de ne yapmak istiyorsun :) – Evk

+1

Bir kod dizgisi ve (sonunda) bir isim alanını kodlamak arasındaki fark nedir? –

+1

Niçin ilgilenirim ki, yansımada bir 'NamespaceInfo' sınıfı gibi bir şey yok. Tam olarak anlamıyorum, neden burada ihtiyacın var? Neden dize yok? 'Type.Namespace' ile karşılaştırmak istediğiniz bilgiyi nereden alıyorsunuz? Derleme zamanında biliniyorsa, neden dize yok? –

cevap

4

Bunu tanımlayabilirsiniz. Örneğin

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

: test durumlarda olarak

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

İki tip: Burada

namespace My 
{ 
    class SomeTypeA { } 
} 

namespace My.Inner 
{ 
    class SomeTypeB { } 
} 

kullanım edilir:

Eğer kontrolü gerçekleştirmek istediğiniz ad olduğunu
Console.WriteLine(My.Inner.Namespace.Contains<SomeTypeA>()); // False 
Console.WriteLine(My.Inner.Namespace.Contains<SomeTypeB>()); // True 
+0

Bu, İçeriği yöntemini tek bir ad alanına sınırlar, böylece her sınıfı örneğin "System.Data" ve "System.IO" da çoğaltmanız gerekir –

+0

@cFrozenDeath True, oldukça sınırlı. Sorun, CLR'de hiçbir isim alanının olmaması, sadece isimlerinde noktaların bulunduğu türlerin olmasıdır. Yani bir yol ya da başka bir dizgeyi kullanmaktan kaçınmanız gerekiyorsa, o isim alanında referans verebileceğiniz bir şey koymanız gerekir. –

+0

Cevabımdaki düzenlemeye bakın, hardcoding dizeleri olmadan yapabileceğimiz en iyi şey olmalı. –

4

Böyle bir şey yapmak mümkün olmalıdır:

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

Sonra kullanmak: @Theodoros Chatzigiannakis fikri kullanarak, aynı zamanda

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 
} 

, daha fazla bu genelleme olabilir gibi:

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

Bir sınıfın bir ad alanının parçası olup olmadığını kontrol etmek istiyorum, iki sınıf aynı ad alanının parçası değilse. Sorgumun açık olup olmadığından emin değilim .... – Dante

+0

@Dante benim düzenime bak, belki daha iyi? –

+0

Yardım ve fikirler için teşekkürler. Hala aradığım şey değil. Belirli bir ad alanında olup olmadığını kontrol etmek istediğim sadece bir sınıfım var. İki sınıfın isim alanlarını karşılaştırıyorsunuz. – Dante

İlgili konular