Класс System.Activator

Класс System.Activator

Класс System.Activator обеспечивает возможность реализации процесса динамической привязки в .NET. Кроме методов, унаследованных от System.Object, сам класс Activator определяет очень небольшое множество членов, многие из которых относятся к средствам удаленного взаимодействия .NET (cм. главу 18). Для нашего примера нам понадобится только метод Activator.CreateInstance(), который используется для создания экземпляра типа в рамках динамической привязки.

Этот метод имеет множество перегруженных вариаций, что обеспечивает ему исключительную гибкость. Самая простая вариация члена CreateInstance() должна получить на вход объект Туре, описывающий элемент, который вы хотите динамически разместить. Создайте новое приложение с именем LateBinding и модифицируйте его метод Main() так, как показано ниже (не забудьте поместить копию CarLibrary.dll в каталог BinDebug проекта).

// Динамическое создание типа.

public class Program {

 static void Main(string[] args) {

  // Попытка загрузить локальную копию CarLibrary.

  Assembly a = null;

  try {

   a = Assembly.Load("CarLibrary");

  } catch(FileNotFoundException e) {

   Console.WriteLine(e.Message);

   Console.ReadLine();

   return;

  }

  // Получение метаданных типа Minivan.

  Type miniVan = a.GetType("CarLibrary.MiniVan");

  // Динамическое создание Minivan.

  object obj = Activator.Createlnstance(miniVan);

 }

}

Обратите внимание на то, что метод Activator.CreateInstance() возвращает обобщенный System.Object, а не строго типизированный MiniVan. Поэтому если к переменной obj вы примените операцию, обозначаемую точкой, то не увидите никаких членов типа MiniVan. На первый взгляд, можно предположить, что эта проблема решается с помощью явного преобразования типа, но ведь программа не имеет никаких указаний на то, что MiniVan должен иметь при выборе какие-либо преимущества.

Весь смысл динамической привязки заключается в создании экземпляров объектов, для которых нет статической информации. Но как при этом можно вызвать методы объекта MiniVan, сохраненного в переменной System.Object? Ответ: с помощью отображений.