Проверьте, принадлежит ли тип пространству имен без жестко заданных строк
Можно ли проверить, является ли тип частью пространства имен без использования привязанных строк?
Я пытаюсь сделать что-то вроде:
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));