8
votes

Comment vérifier si la chaîne est un espace de noms

J'ai une chaîne et je veux vérifier si cela représente un espace de nom propre, par exemple. system.io est ok, mais system.lol n'est pas.

Je suppose que certaines réflexions doivent être utilisées, mais je ne peux pas comprendre cela.

Toutes les pensées?


0 commentaires

5 Réponses :


0
votes

Le CLR n'a pas vraiment de concept de "espaces de noms": ils sont vraiment peu plus qu'une convention de dénomination. Donc, il n'y a pas d'API pour "List des espaces de noms" ou "Obtenir des espaces de noms" ou même "Obtenir tous les types d'espace de noms".

Le meilleur que vous puissiez faire est de boucler à travers toutes les assemblées chargées, puis bouclez tous les types exportés dans chacun de ces assemblages et vérifiez si la chaîne donnée est un «préfixe» sur l'un de ces noms de type. J'imagine que cette solution ne serait pas le plus rapide du monde, mais cela ne serait pas totalement impraticable, non plus.


0 commentaires

-1
votes

Il n'y a pas de réflexion sur les espaces de noms. Les espaces de noms définissent le nom de type complet. Donc, ce que vous devez faire est:

  • énumérer tous les types (vous ne spécifiez pas l'ensemble source, disons .NET Framework, alors vous devez inclure toutes les assemblages de la valeur par défaut (regarder ceux référencés par VS lorsque vous créez un projet) ou votre assemblage personnalisé. , alors types dans l'assembly).
  • Recherchez la propriété Espace de noms sur le type donné

    Ce que vous devez utiliser:

    Méthode de chargement de la charge < / p>

    Méthode Assembly.getTypes < / p>

    Propriété de type.NamesPace


0 commentaires

2
votes

Pourriez-vous faire cela? XXX

Vérifiez simplement pour voir si la chaîne est dans la liste?

(Soyez averti, ce n'est pas testé! )


0 commentaires

8
votes

Essayez cette approche: xxx pré>

cs0234 code> est: p>

Le nom de type ou d'espace de noms 'Nom' fait n'existe pas dans la classe ou l'espace de noms 'Portée' (manquez-vous une assemblée Référence?) P> blockQuote>

Références personnalisées Ajout: P>

public static void Main(string[] args)
{
    using (var tester = new NamespaceTester())
    {
        var success = tester.Test(new[] {
            "System.IO",
            "System.LOL"
        });
    }
}


0 commentaires

4
votes

Votre question "Comment vérifier si la chaîne est un espace de noms" n'est valide que lorsque vous envisagez vous vérifiez les espaces de noms.

Les espaces de noms sont des préfixes aux noms de classe, et les classes sont scopées à un assemblage. Pour vérifier si un espace de noms existe, vous devez décider quels assemblages vous êtes prêt à rechercher l'existence de l'espace de noms.

Une fois que vous avez décidé quels assemblages vous êtes prêt à rechercher, vous pouvez itération. à travers eux pour l'existence d'un espace de noms particulier comme: xxx


4 commentaires

BTW, vous ne pouvez pas utiliser le mot-clé réservé espace de noms comme nom de variable;)


Juste pour la correction de l'exactitude, vous devriez @ -izer le paramètre d'espace de noms, l'espace de noms est un mot clé C # :)


Oh, si pointilleux! Je suis à peu près sûr que la réponse est lisible sans, mais une édition est la vôtre. :)


Retour Assemblys.SelectMany (A => A.GetTypes ()). Toute (t => t.Namespace == ns)