• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

C# динамический доступ к элементу с использованием метода InvokeMember

Это, можно сказать, один из фокусов: как вызвать какой-либо элемент (конструктор, метод, свойство и т.д.) динамически определив его имя? Например ситуация, есть несколько методов, которые имеют разные имена. Их всех нужно вызвать. Пол сотни, но по определенному шаблону у них совпадают имена. Писать их вручную, описывая каждую? Неее… Для таких целей есть интересный метод InvokeMember, который вызывает заданный элемент.

Реализация

Создаем класс TestRun. В нем описано 3 метода, которые просто выводят текст в консоль.

1 class TestRun
2 {
3     public void Write1()
4     {
5         Console.WriteLine("Вызвали Write1");
6     }
7  
8     public void Write2()
9     {
10         Console.WriteLine("Вызвали Write2");
11     }
12  
13     public void Write3(string text)
14     {
15         Console.WriteLine(text);
16     }
17 }

С этим классом и будем работать.

1 static void Main(string[] args)
2 {
3     //Создаем новый объект
4     TestRun tr = new TestRun();
5     //В цикле вызываем каждый метод нашего объекта
6     for (int i = 1; i < 3; i++ )
7     {
8         //Подставляем имя метода
9         //BindingFlags.InvokeMethod говорит, что это метод
10         tr.GetType().InvokeMember("Write" + i, BindingFlags.InvokeMethod, null, tr, null);
11     }
12     //Вызываем еще один метод и передаем ему аргумент
13     tr.GetType().InvokeMember("Write" + 3, BindingFlags.InvokeMethod, null, tr, new object[] { "Вызвали Write3" });
14  
15     //Создаем тип
16     Type tDate = typeof(System.DateTime);
17     //Вызываем свойство DateTime.Now
18     //BindingFlags.GetProperty говорит, что это свойство
19     Object result = tDate.InvokeMember("Now", BindingFlags.GetProperty, null, null, new Object[0]);
20     //Выводим результат в консоль
21     Console.WriteLine(result.ToString());
22  
23     Console.ReadLine();
24 }

В цикле вызвали 2 метода, предварительно создав динамически имя. Далее вызвали еще один метод, но передали один параметр.
В самом конце пример работы со свойством DateTime.Now.
О всех параметрах метода InvokeMember читайте в MSDN.
К статье прилагаю рабочий проект с примером.