Considérez que j’ai un Assembly (classe bibliothèque dll) que j’ai chargé en utilisant le code suivant,
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");
et j'ai besoin de connaître le type de l'Assemblée. Pour obtenir le typei, il faut l'espace de noms de l'assembly.
Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);
comment puis-je obtenir l'espace de noms dans la ligne ci-dessus.?! comme pour obtenir le Namespace , je dois obtenir le type ..?
Type.Namespace;
c'est-à-dire que je dois obtenir l'espace de noms de l'assembly qui peut être utilisé pour obtenir son type.
Merci d'avance
Utilisez Assembly.GetTypes () - vous obtiendrez une collection de tous les types, puis vous pourrez obtenir la propriété Namespace pour chacun d’eux.
Ensuite, je suppose que vous pouvez simplement vérifier que tous les types ont la même valeur d’espace de noms et utiliser cette valeur. Sinon, ajoutez une autre logique pour détecter quel espace de nom considérer comme primaire.
Un assembly peut contenir plusieurs espaces de noms. Je pense que ce que vous voulez vraiment demander, c'est comment obtenir un type d'une assemblée sans spécifier l'espace de noms.
Je ne sais pas s'il existe un meilleur moyen, mais vous pouvez essayer de rechercher un type spécifique comme celui-ci (add - using linq;):
myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")
Cela se produira s'il y a plus d'une classe portant ce nom sous différents espaces de noms (car la méthode Single garantit qu'il n'y en a qu'une).
Pour obtenir une liste des espaces de noms de cette classe, vous pouvez:
Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
Mis à jour:
IFtheAssembly name
&Assembly namespace
are same dans votre projet et que vous gardiez le même thèmeETvous voulez obtenir l'espace de nom du Assemblée actuellement exécutée alors vous pouvez utiliser ceci:
var namespace = Assembly.GetExecutingAssembly().GetName().Name;
Et pour votre assemblée chargée:
var namespace = myAssembly.GetName().Name;
MaisSIle Assembly name
& Assembly namespace
ne sont pas identiques dans votre projet, vous pouvez utiliser cette méthode:
// 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();
Avec Mono/Xamarin, vous n’avez pas accès à la propriété "NameSpace". Vous pouvez utiliser les éléments suivants à la place:
var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
Assembly.GetName().Name
vous donnera l'espace de noms par défaut
Alors, voici la solution que j'ai trouvée:
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.
}
Je trouve juste tous les types dans l'assembly requis et je recherche ce qui est contenu dans l'espace de noms ayant le nom le plus court.
Pour ne prendre que l'espace de noms, suivez le code ci-dessous:
var Assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the Assembly object
var nameSpace = Assembly.GetType().Namespace;//Get the namespace
OU
public string GetNamespace(object obj)
{
var nameSpace = obj.GetType().Namespace;//Get the namespace
return nameSpace;
}