Проверьте, принадлежит ли тип пространству имен без жестко заданных строк

Можно ли проверить, является ли тип частью пространства имен без использования привязанных строк?

Я пытаюсь сделать что-то вроде:

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

или

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

чтобы избежать

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

Эти примеры не компилируются, но должны дать представление о том, чего я пытаюсь достичь.

Я не могу использовать nameof(System.Data), потому что он возвращает только "Data".

Я хотел бы найти способ проверить, является ли класс if частью пространства имен без необходимости иметь это пространство имен в строке.

Ответ 1

Вы можете определить это в пространстве имен, где вы хотите выполнить проверку:

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

Ответ 2

Вы должны сделать что-то вроде этого:

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
}

Кроме того, используя идею от @Theodoros Chatzigiannakis, вы можете дополнительно обобщить это:

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

И затем используйте его как:

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