C# динамический доступ к элементу с использованием метода InvokeMember
Это, можно сказать, один из фокусов: как вызвать какой-либо элемент (конструктор, метод, свойство и т.д.) динамически определив его имя? Например ситуация, есть несколько методов, которые имеют разные имена. Их всех нужно вызвать. Пол сотни, но по определенному шаблону у них совпадают имена. Писать их вручную, описывая каждую? Неее… Для таких целей есть интересный метод InvokeMember, который вызывает заданный элемент.
Реализация
Создаем класс TestRun. В нем описано 3 метода, которые просто выводят текст в консоль.
class TestRun
{
public void Write1()
{
Console.WriteLine("Вызвали Write1");
}
public void Write2()
{
Console.WriteLine("Вызвали Write2");
}
public void Write3(string text)
{
Console.WriteLine(text);
}
}
С этим классом и будем работать.
static void Main(string[] args)
{
//Создаем новый объект
TestRun tr = new TestRun();
//В цикле вызываем каждый метод нашего объекта
for (int i = 1; i < 3; i++ )
{
//Подставляем имя метода
//BindingFlags.InvokeMethod говорит, что это метод
tr.GetType().InvokeMember("Write" + i, BindingFlags.InvokeMethod, null, tr, null);
}
//Вызываем еще один метод и передаем ему аргумент
tr.GetType().InvokeMember("Write" + 3, BindingFlags.InvokeMethod, null, tr, new object[] { "Вызвали Write3" });
//Создаем тип
Type tDate = typeof(System.DateTime);
//Вызываем свойство DateTime.Now
//BindingFlags.GetProperty говорит, что это свойство
Object result = tDate.InvokeMember("Now", BindingFlags.GetProperty, null, null, new Object[0]);
//Выводим результат в консоль
Console.WriteLine(result.ToString());
Console.ReadLine();
}
В цикле вызвали 2 метода, предварительно создав динамически имя. Далее вызвали еще один метод, но передали один параметр.
В самом конце пример работы со свойством DateTime.Now.
О всех параметрах метода InvokeMember читайте в MSDN.
К статье прилагаю рабочий проект с примером.
Популярность: 10%
Если у вас возникли вопросы, вы можете оставить их в комментариях

