Question

J'ai écrit une application qui teste notre unité matérielle via un navigateur Internet.

Je classes de commandes dans l'assemblage qui sont une enveloppe autour des actions de navigateur Web individuelles telles que cochant une case à cocher, sélectionnant dans une liste déroulante en tant que tel:

BasicConfigurationCommands
EventConfigurationCommands
StabilizationCommands

et un ensemble de classes test , qui utilisent les classes de commandes pour effectuer des tests scriptés:

ConfigurationTests
StabilizationTests

Ceux-ci sont ensuite appelé via l'interface utilisateur graphique exécuter des tests prescripted par notre équipe QA . Cependant, comme le firmware est changé assez rapidement entre les versions ce serait bien si un développeur pourrait écrire un fichier XML qui pourrait Invoke soit les tests ou les commandes :

<?xml version="1.0" encoding="UTF-8" ?> 
<testsuite>
    <StabilizationTests>
        <StressTest repetition="10" />
    </StabilizationTests>
    <BasicConfigurationCommands>
        <SelectConfig number="2" />
        <ChangeConfigProperties name="Weeeeee" timeOut="15000" delay="1000"/>
        <ApplyConfig />
    </BasicConfigurationCommands> 
</testsuite>

Je cherchais à la classe System.Reflection et ont vu des exemples en utilisant GetMethod et Invoke ensuite. Cela me demande de créer l'objet de classe au moment de la compilation et Je voudrais faire tout cela lors de l'exécution .

Je besoin de balayer toute l'assemblée pour le nom de la classe, puis rechercher automatiquement la méthode dans la classe.

Cela semble une grande solution, de sorte que toute information me pointage (et futurs lecteurs de ce post) vers une réponse serait formidable!

Merci pour la lecture,

Matt

Était-ce utile?

La solution

Pour toutes les classes dans un assemblage:

public Type FindClass(string name)
{
   Assembly ass = null;
   ass = Assembly.Load("System.My.Assembly"); // Load from the GAC
   ass = Assembly.LoadFile(@"c:\System.My.Assembly.dll"); // Load from file
   ass = Assembly.LoadFrom("System.My.Assembly"); // Load from GAC or File

   foreach(Type t in ass.GetTypes())
   {
      if (t.Name == name)
         return t;
   }

   return null;
}

En réalité, vous devez marquer votre classe avec un attribut, il les rend plus découvrable.

Pour instancier une instance de ladite classe:

public T Instantiate<T>(Type typ, object[] arguments)
{
    return (T)Activator.CreateInstance(typ, arguments, null);
}

Ne pas oublier, vous devriez probablement envelopper ces derniers avec essayer appropriés / blocs catch

Ensuite, pour trouver une méthode sur une classe

Type t = FindClass("MyType");
MethodInfo meth = t.GetMethod("TestSomething", typeof(string), typeof(int)); // finds public ??? TestSomething(string, int)

Il suffit de jouer avec l'Explorateur d'objets dans VStudio et apprendre les classes de réflexion, il y a beaucoup que vous pouvez faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top