Как получить Пространство имен сборки? - PullRequest
30 голосов
/ 17 марта 2009

Считайте, что у меня есть сборка (библиотека классов DLL), которую я загрузил, используя следующий код,

Assembly a = Assembly.LoadFrom(@"C:\Documents and Settings\E454935\My Documents\Visual Studio 2005\Projects\nunit_dll_hutt\for_hutt_proj\bin\Debug\asdf.dll");   

и мне нужно получить тип сборки. Чтобы получить тип , мне нужно пространство имен сборки.

Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);             

как я могу получить Пространство имен в приведенной выше строке.?! как для получения пространства имен , мне нужно получить тип ..?

Type.Namespace;

Т.е. мне нужно получить пространство имен сборки, которое можно использовать для получения его типа.

Заранее спасибо

Ответы [ 7 ]

33 голосов
/ 17 марта 2009

Используйте Assembly.GetTypes () - это даст вам коллекцию всех типов, а затем вы сможете получить свойство Namespace для каждого из них.

Тогда, я думаю, вы можете просто проверить, что все типы имеют одинаковое значение Namespace и использовать это значение. В противном случае добавьте некоторую другую логику, чтобы определить, какое пространство имен считать основным.

22 голосов
/ 17 марта 2009

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

Я не знаю, есть ли лучший способ, но вы можете попробовать поискать конкретный тип, как этот (добавить - используя linq;):

myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")

Это эффективно сгенерирует, если существует более 1 класса с таким именем в разных пространствах имен (потому что метод Single гарантирует, что есть только 1).

Для получения списка пространств имен для этого класса вы можете:

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
16 голосов
/ 06 мая 2015

Обновлен:

IF assembly name & assembly namespace являются одинаковыми в вашем проекте, и вы обязательно оставите тему такой же И вы хотите получить пространство имен текущей выполненной сборки , затем вы можете использовать это:

var namespace = Assembly.GetExecutingAssembly().GetName().Name;

А для вашей загруженной сборки:

var namespace = myAssembly.GetName().Name;

Но ЕСЛИ assembly name & assembly namespace не равны в вашем проекте, тогда вы можете использовать этот способ:

// Like @eglasius answer >>
// Find all namespaces in the target assembly where a class with the following name is exists:
var namespaceList=Assembly.Load("MyClassName").GetTypes().Select(t => t.Namespace).Distinct();
1 голос
/ 11 декабря 2016

Используя Mono / Xamarin, у вас нет доступа к свойству «NameSpace». Вместо этого вы можете использовать следующее:

var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
0 голосов
/ 19 июля 2017

Получение того, что сборка должна содержать почти класс (или любой другой тип, например интерфейс), и они должны содержаться в пространстве имен, которое должно начинаться в пространстве имен сборки, самый короткий из них будет последним .

Итак, вот решение, которое я нашел:

public string GetAssemblyNamespace(Assembly asm)
{
    string ns = @"";
    foreach (Type tp in asm.Modules.First().GetTypes()) //Iterate all types within the specified assembly.
        if (ns.Length == 0 ? true : tp.Namespace.Length < ns.Length) //Check whether that's the shortest so far.
            ns = tp.Namespace; //If it's, set it to the variable.
    return ns; //Now it is the namespace of the assembly.
}

Я просто нахожу все типы в требуемой сборке и ищу, что содержится в пространстве имен с самым коротким именем.

0 голосов
/ 13 апреля 2016

Чтобы взять только пространство имен, следуйте приведенному ниже коду:

  var assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the assembly object
  var nameSpace = assembly.GetType().Namespace;//Get the namespace

OR

public string GetNamespace(object obj)
{
    var nameSpace = obj.GetType().Namespace;//Get the namespace

    return nameSpace;
}
0 голосов
/ 29 октября 2014

Assembly.GetName().Name даст вам пространство имен по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...