Разбирать имена функций XML и вызывать их во всей сборке - PullRequest
0 голосов
/ 13 мая 2010

Я написал приложение, которое тестирует наше оборудование через интернет-браузер.

У меня есть командные классы в сборке, которые являются оболочкой для отдельных действий веб-браузера, таких как установка флажка и выбор из выпадающего списка следующим образом:

BasicConfigurationCommands
EventConfigurationCommands
StabilizationCommands

и набор тестовых классов , которые используют командные классы для выполнения скриптовых тестов:

ConfigurationTests
StabilizationTests

Затем они вызываются через графический интерфейс для выполнения предписанных тестов нашей командой QA . Однако, поскольку прошивка меняется довольно быстро между выпусками, было бы замечательно, если бы разработчик мог написать файл XML , который мог бы вызывать либо тесты, либо команды :

<?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>

Я смотрел на класс System.Reflection и видел примеры использования GetMethod и затем Invoke. Это требует от меня создания объекта класса во время компиляции и Я хотел бы сделать все это во время выполнения .

Мне нужно отсканировать всю сборку на предмет имени класса, а затем отсканировать метод в классе.

Это кажется большим решением, поэтому любая информация, указывающая мне (и будущим читателям этого поста) на ответ, была бы отличной!

Спасибо за чтение,

Мэтт

1 Ответ

2 голосов
/ 13 мая 2010

Чтобы найти все классы в сборке:

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;
}

На самом деле вы должны пометить свой класс атрибутом, это делает его более доступным для обнаружения.

Чтобы создать экземпляр указанного класса:

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

Не забывайте, вы, вероятно, должны обернуть их соответствующими блоками try / catch

Затем найти метод для класса

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

Просто поиграйтесь с Object Browser в VStudio и выучите классы Reflection, вы можете многое сделать.

...