Как получить пространство имен сборки?
У меня есть сборка (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);
как я могу получить пространство имен в приведенной выше строке??! как inorder, чтобы получить пространство имен, мне нужно получить тип..?
Type.Namespace;
i.e Мне нужно получить пространство имен сборки, которое можно использовать для получения его типа.
Заранее спасибо
Ответы
Ответ 1
Используйте Assembly.GetTypes() - это даст вам коллекцию всех типов, а затем вы можете получить свойство Namespace для каждого из них.
Тогда, я думаю, вы можете просто проверить, что все типы имеют одинаковое значение пространства имен и используют это значение. В противном случае добавьте другую логику, чтобы определить, какое пространство имен следует рассматривать как первичное.
Ответ 2
Сборка может содержать несколько пространств имен. Я думаю, что вы действительно хотите спросить, как получить тип из сборки без указания пространства имен.
Я не знаю, есть ли лучший способ, но вы можете попробовать искать определенный тип, подобный этому (add-using linq;):
myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")
Это эффективно срабатывает, если в разных пространствах имен существует более одного класса с этим именем (поскольку метод Single гарантирует, что существует только 1).
Для списка пространств имен для этого класса вы можете:
Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
Ответ 3
Обновлено:
IF assembly name
и assembly namespace
одинаковые в вашем проекте, и вы обязательно держите тему те же И, вы хотите получить пространство имен текущей выполненной сборки , затем, вы можете использовать это:
var namespace = Assembly.GetExecutingAssembly().GetName().Name;
И для вашей загруженной сборки:
var namespace = myAssembly.GetName().Name;
Но IF 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();
Ответ 4
Assembly.GetName().Name
предоставит вам пространство имен по умолчанию
Ответ 5
Используя Mono/Xamarin, у вас нет доступа к свойству "NameSpace". Вместо этого вы можете использовать следующее:
var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
Ответ 6
Чтобы принять только пространство имен, следуйте приведенному ниже коду:
var assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the assembly object
var nameSpace = assembly.GetType().Namespace;//Get the namespace
ИЛИ
public string GetNamespace(object obj)
{
var nameSpace = obj.GetType().Namespace;//Get the namespace
return nameSpace;
}
Ответ 7
Получение сборки должно содержать почти класс (или любой другой тип, такой как интерфейс), и они должны содержаться в пространстве имен, которое должно начинаться в пространстве имен сборки, причем самый короткий из них будет последним.
Итак, вот решение, которое я нашел:
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 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.
}
Я просто нахожу все типы внутри необходимой сборки, и я ищу, что содержится в пространстве имен, имеющем кратчайшее имя.