C# динамический доступ к элементу с использованием метода InvokeMember
Это, можно сказать, один из фокусов: как вызвать какой-либо элемент (конструктор, метод, свойство и т.д.) динамически определив его имя? Например ситуация, есть несколько методов, которые имеют разные имена. Их всех нужно вызвать. Пол сотни, но по определенному шаблону у них совпадают имена. Писать их вручную, описывая каждую? Неее… Для таких целей есть интересный метод InvokeMember, который вызывает заданный элемент.
Реализация
Создаем класс TestRun. В нем описано 3 метода, которые просто выводят текст в консоль.
1
classTestRun
2
{
3
publicvoidWrite1()
4
{
5
Console.WriteLine("Вызвали Write1");
6
}
7
8
publicvoidWrite2()
9
{
10
Console.WriteLine("Вызвали Write2");
11
}
12
13
publicvoidWrite3(stringtext)
14
{
15
Console.WriteLine(text);
16
}
17
}
С этим классом и будем работать.
1
staticvoidMain(string[] args)
2
{
3
//Создаем новый объект
4
TestRun tr = newTestRun();
5
//В цикле вызываем каждый метод нашего объекта
6
for(inti = 1; i < 3; i++ )
7
{
8
//Подставляем имя метода
9
//BindingFlags.InvokeMethod говорит, что это метод
10
tr.GetType().InvokeMember("Write"+ i, BindingFlags.InvokeMethod, null, tr, null);
//BindingFlags.GetProperty говорит, что это свойство
19
Object result = tDate.InvokeMember("Now", BindingFlags.GetProperty, null, null, newObject[0]);
20
//Выводим результат в консоль
21
Console.WriteLine(result.ToString());
22
23
Console.ReadLine();
24
}
В цикле вызвали 2 метода, предварительно создав динамически имя. Далее вызвали еще один метод, но передали один параметр. В самом конце пример работы со свойством DateTime.Now. О всех параметрах метода InvokeMember читайте в MSDN. К статье прилагаю рабочий проект с примером.