2 votes

C# - Obtenir l'espace de noms auquel appartient une fonction ?

De même, si je saisis la chaîne "Console.WriteLine", elle renverra -> "System.Console.WriteLine"

Je suppose qu'il existe un moyen d'y parvenir par le biais de Reflection.

5voto

Lasse V. Karlsen Points 148037

Le problème est un peu plus difficile que vous ne le pensez.

Tout d'abord, il est assez simple d'analyser tous les types dans tous les assemblages chargés. Ainsi, par exemple, pour trouver exactement ce que vous cherchez, voici ce que vous pouvez faire :

void Main()
{
    String input = "Console.WriteLine";

    var fullNames =
        (from asm in AppDomain.CurrentDomain.GetAssemblies()
         from type in asm.GetTypes()
         from member in type.GetMembers()
         let memberWithName = type.Name + "." + member.Name
         where memberWithName == input
         select type.FullName + "." + member.Name).Distinct();
     fullNames.Dump();
}

Remarque : le code ci-dessus est écrit de manière à être exécuté par l'intermédiaire de l'application LINQPad La requête LINQ est ce que vous recherchez.

Il y a cependant un petit problème.

Que se passe-t-il si l'assemblage n'est pas (encore) chargé ? Vous ne le trouverez pas dans ce cas. De plus, dans la requête ci-dessus, le but de l'appel à Distinct est que Console a un certain nombre de surcharges. Il est vrai que, dans votre cas, elles produiraient toutes le même nom, d'où l'appel à Distinct .

Notez également que si je crée ma propre classe appelée Console con un WriteLine le code ci-dessus le trouverait également, il n'y a aucun moyen de faire la distinction entre les deux.

Lorsque vous avez de tels scénarios dans votre code (c'est-à-dire plusieurs classes), la fonction using au début du fichier détermine celui qui sera trouvé. Avec ce code, il n'y a rien de tel, vous devrez donc coder vous-même les règles pour cela.

Maintenant, une meilleure question (de moi à vous) est de savoir à quoi vous comptez utiliser ce code. Nous pourrions peut-être mieux vous aider si vous nous disiez quel est votre but ultime.

0voto

SLaks Points 391154

Recherchez le nom sur Google ; vous trouverez généralement la documentation MSDN, qui vous donne l'espace de noms.

En utilisant la réflexion, vous devriez parcourir chaque classe de chaque espace de noms de chaque assemblage à la recherche de correspondances.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X