Читаем C# 4.0: полное руководство полностью

// Теперь получаются сведения только о тех методах,

// которые объявлены в классе MyClass.

MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly |

                 BindingFlags.Instance |

                 BindingFlags.Public);

После этой замены программа дает следующий результат.

Анализ методов, определенных в классе MyClass

Поддерживаемые методы:

Int32 Sum()

Boolean IsBetween(Int32 i)

Void Set(Int32 a, Int32 b)

Void Set(Double a, Double b)

Void Show()

Как видите, теперь выводятся только те методы, которые явно определены в классе MyClass.

Вызов методов с помощью рефлексии

Как только методы, поддерживаемые определенным типом данных, становятся известны, их можно вызывать. Для этой цели служит метод Invoke(), входящий в состав класса Methodlnfо. Ниже приведена одна из форм этого метода:

object Invoke(object obj, object[] parameters)

где obj обозначает ссылку на объект, для которого вызывается метод. Для вызова статических методов (static) в качестве параметра obj передается пустое значение (null). Любые аргументы, которые должны быть переданы методу, указываются в массиве parameters. Если же аргументы не нужны, то вместо массива parameters указывается пустое значение (null). Кроме того, количество элементов массива parameters должно точно соответствовать количеству передаваемых аргументов. Так, если требуется передать два аргумента, то массив parameters должен состоять из двух элементов, но не из трех или четырех. Значение, возвращаемое вызываемым методом, передается методу Invoke(), который и возвращает его.

Для вызова конкретного метода достаточно вызвать метод Invoke() для экземпляра объекта типа Methodlnfо, получаемого при вызове метода GetMethods(). Эта процедура демонстрируется в приведенном ниже примере программы.

// Вызвать методы с помощью рефлексии.

using System;

using System.Reflection;

class MyClass {

  int x;

  int y;

  public MyClass(int i, int j) {

    x = i;

    y = j;

  }

  public int Sum() {

    return x + y;

  }

  public bool IsBetween(int i) {

    if ((x < i) && (i < y)) return true;

    else return false;

  }

  public void Set(int a, int b) {

    Console.Write("В методе Set (int, int). ");

    x = a;

    y = b;

    Show();

  }

  // Перегрузить метод Set.

  public void Set(double a, double b) {

    Console.Write("В методе Set(double, double). ");

    x = (int)a;

    y = (int)b;

    Show();

  }

  public void Show() {

    Console.WriteLine("Значение x: {0}, значение у: {1}", x, y);

  }

}

class InvokeMethDemo {

  static void Main() {

    Type t = typeof(MyClass);

    MyClass reflectOb = new MyClass(10, 20);

    int val;

    Console.WriteLine("Вызов методов, определенных в классе " + t.Name);

    Console.WriteLine();

    MethodInfo[] mi = t.GetMethods();

    // Вызвать каждый метод,

    foreach (MethodInfo m in mi) {

      // Получить параметры.

      ParameterInfo[] pi = m.GetParameters();

      if (m.Name.CompareTo("Set") == 0 && pi[0].ParameterType == typeof(int)) {

        object[] args = new object[2];

        args[0] = 9;

        args[1] = 18;

        m.Invoke(reflectOb, args);

      }

      else if (m.Name.CompareTo("Set") == 0 &&

              pi[0].ParameterType == typeof(double)) {

        object[] args = new object[2];

        args[0] = 1.12;

        args[1] = 23.4;

        m.Invoke(reflectOb, args);

      }

      else if (m.Name.CompareTo("Sum") == 0) {

        val = (int)m.Invoke(reflectOb, null);

        Console.WriteLine("Сумма равна " + val);

      }

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных