C# - Comment vérifier si namespace, class ou method existe dans C#?

j'ai un programme class="blnk">C#, Comment puis-je vérifier à l'exécution s'il existe un namespace, une classe ou une méthode? Aussi, comment instancier une classe en utilisant son nom sous forme de chaîne de caractères?

Pseudo:

string @namespace = "MyNameSpace";
string @class = "MyClass";
string method= "MyMEthod";

var y = IsNamespaceExists(namespace);
var x = IsClassExists(@class)? new @class : null; //Check if exists, instantiate if so.
var z = x.IsMethodExists(method);
33
demandé sur Sai Kalyan Kumar Akshinthala 2011-12-14 08:47:18

3 réponses

Vous pouvez utiliser Type.GetType (string) pour refléter une classe. Type a des méthodes pour découvrir d'autres membres, y compris une méthode, qui sont disponibles pour ce type.

Un truc, cependant, est que GetType veut un assemblage nom qualifié. Si vous n'utilisez que le nom de classe lui-même, il supposera que vous faites référence à l'Assemblée actuelle.

donc, si vous vouliez trouver le type dans tous les assemblages chargés, vous pouvez faire quelque chose comme ceci (en utilisant LINQ):

var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
            from type in assembly.GetTypes()
            where type.Name == className
            select type);

bien sûr, il peut y avoir plus que cela, où vous voudrez réfléchir sur les assemblages référencés qui peuvent ne pas encore être chargés, etc.

en ce qui concerne la détermination des espaces de noms, la réflexion n'exporte pas ceux-ci distinctement. Au lieu de cela, vous devez faire quelque chose comme:

var namespaceFound = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.Namespace == namespace
select type).Any()

Mettre tous ensemble, vous auriez quelque chose comme:

var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
                from type in assembly.GetTypes()
                where type.Name == className && type.GetMethods().Any(m => m.Name == methodName)
                select type).FirstOrDefault();

if (type == null) throw new InvalidOperationException("Valid type not found.");

object instance = Activator.CreateInstance(type);
40
répondu HackedByChinese 2011-12-14 05:23:18

Vous pouvez résoudre un Tapez à partir d'une chaîne à l'aide de la Type.GetType (String) méthode. Par exemple:

Type myType = Type.GetType("MyNamespace.MyClass");

vous pouvez alors utiliser cette instance de Type pour vérifier si une méthode existe sur le type en appelant le GetMethod (String) méthode. Par exemple:

MethodInfo myMethod = myType.GetMethod("MyMethod");

GetType et GetMethod return null si aucun type ou méthode n'a été trouvé pour le prénom, Vous pouvez donc vérifier si votre type / méthode existe en vérifiant si votre méthode appel retourné nul ou non.

Enfin, vous pouvez instancier votre type d'utilisation Activateur.CreateInstance (Type) Par exemple:

object instance = Activator.CreateInstance(myType);
30
répondu MatthewKing 2011-12-14 05:01:24

Un seul mot: Réflexion. Sauf pour les Namespaces, vous devrez les séparer des noms de Type.

EDIT: pour les namespaces, vous devrez utiliser le Type.Propriété Namespace pour déterminer à quel namespace chaque classe appartient. (VoirHackedByChinese response pour plus d'informations).

2
répondu M.Babcock 2017-05-23 11:55:10