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%

Теги: ,

Если у вас возникли вопросы, вы можете оставить их в комментариях

Оставить комментарий

(обязательно)

(обязательно)