Вход/Регистрация
C# 4.0 полное руководство - 2011
вернуться

Шилдт Герберт

Шрифт:

// Вывести возвращаемый тип и имя.

Console.Write(" " + t.Name + "(");

// Вывести параметры.

Parameterlnfo[] pi = с.GetParameters ;

for(int i=0; i-< pi.Length; i++) {

Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name); if (i + 1 < pi.Length) Console.Write(", ");

}

Console.WriteLine(")");

}

Console.WriteLine ;

// Найти подходящий конструктор, int х;

for(x=0; х < ci.Length; х++) {

Parametgrlnfo[] pi = ci[x].GetParameters; if(pi.Length == 2) break;

}

if (x == ci.Length) {

Console.WriteLine("Подходящий конструктор не найден."); return;

}

else

Console.WriteLine("Найден конструктор с двумя параметрами.\n");

// Сконструировать объект, object[] consargs = new object[2]; consargs[0] = 10; consargs[1] = 20;

object reflectOb = ci[x].Invoke(consargs) ;

Console.WriteLine("ХпВызов методов для объекта reflectOb."); Console.WriteLine ;

Methodlnfo[] mi = t.GetMethods;

// Вызвать каждый метод, foreach(Methodlnfo m in mi) {

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

Parameterlnfo[] pi = m.GetParameters ; if(m.Name.CompareTo("Set")==0 &&

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

// Это метод Set (int, int). object[] args = new object[2]; args[0] = 9; args[l] = 18;

m. Invoke(reflectOb, args);

}

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

object[] args = new object[1]; args[.0] = 14;

if ((bool) m.Invoke(reflectOb, args))

Console.WriteLine ("Значение 14 находится между x и у");

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

m.Invoke(reflectOb, null);

}

}

}

}

Эта программа дает следующий результат.

Доступные конструкторы:

MyClass(Int32 i)

MyClass(Int32 i, Int32 j)

Найден конструктор с двумя параметрами.

Конструирование класса MyClass(int, int)

Значение х: 10, значение у: 20

Вызов методов для объекта reflectOb

Сумма равна 30

Значение 14 находится между х и у

В методе Set(int, int). Значение х: 9, значение у: 18 В методе Set(double, double). Значение х: 1, значение у: 23 Значение х: 1, значение у: 23

А теперь рассмотрим порядок применения рефлексии для конструирования объекта класса MyClass. Сначала получается перечень открытых конструкторов в следующей строке кода.

Constructorlnfo[] ci = t.GetConstructors ;

Затем для наглядности примера выводятся полученные конструкторы. После этого осуществляется поиск по списку конструктора, принимающего два аргумента, как показано в приведенном ниже фрагменте кода.

for(x=0; х < ci.Length; х++) {

Parameterlnfo[] pi = ci[x].GetParameters; if(pi.Length == 2) break;

}

Если такой конструктор найден, как в данном примере, то в следующем фрагменте кода получается экземпляр объекта заданного типа.

// Сконструировать объект, object[] consargs = new object[2]; consargs[0] = 10; consargs[1] = 20;

object reflectOb = ci[x].Invoke(consargs);

После вызова метода Invoke переменная экземпляра reflectOb будет ссылаться на объект типа MyClass. А далее в программе выполняются соответствующие методы для экземпляра этого объекта.

Следует, однако, иметь в виду, что ради простоты в данном примере предполагается наличие лишь одного конструктора с двумя аргументами типа int. Очевидно, что в реальном коде придется дополнительно проверять соответствие типов каждого параметра и аргумента.

  • Читать дальше
  • 1
  • ...
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: