} Как видите, в данной программе сначала динамически загружается библиотека MyClass.dll, а затем используется рефлексия для построения объекта класса DivBy. Построенный объект присваивается далее переменной obj типа dynamic. А раз так, то методы IsDivBy и IsEven могут быть вызваны для переменной obj по имени, а не с помощью метода Invoke. В данном примере это вполне допустимо, посколь ку переменная obj на самом деле ссылается на объект класса DivBy. В противном слу чае выполнение программы завершилось бы неудачно. Приведенный выше пример сильно упрощен и несколько надуман. Тем не менее он наглядно показывает главное преимущество, которое дает тип dynamic в тех случаях, когда типы получаются во время выполнения. Когда характеристики искомого типа, в том числе методы, операторы, поля и свойства, заранее известны, эти характеристи ки могут быть получены по имени с помощью типа dynamic, как следует из приведен ного выше примера. Благодаря этому код становится проще, короче и понятнее. Применяя тип dynamic, следует также иметь в виду, что при компиляции програм мы тип dynamic фактически заменяется объектом, а для описания его применения во время выполнения предоставляется соответствующая информация. И поскольку тип dynamic компилируется в тип object для целей перегрузки, то оба типа dynamic и object расцениваются как одно и то же. Поэтому при компиляции двух следующих перегружаемых методов возникнет ошибка.
static void f(object v) { // ... } static void f(dynamic v) { // ... } // Ошибка! И последнее замечание: тип dynamic поддерживается компонентом DLR (Dynamic Language Runtime — Средство создания динамических языков во время выполнения), внедренным в .NET 4.0. ## Возможность взаимодействия с моделью СОМ В версии C# 4.0 внедрены средства, упрощающие возможность взаимодействия с неуправляемым кодом, определяемым моделью компонентных объектов (СОМ) и применяемым, в частности, в COM-объекте Office Automation. Некоторые из этих средств, в том числе тип dynamic, именованные и необязательные свойства, пригодны для применения помимо возможности взаимодействия с моделью СОМ. Тема модели СОМ вообще и COM-объекта Office Automation в частности весьма обширна, а порой и довольно сложна, чтобы обсуждать ее в этой книге. Поэтому возможность взаимодей ствия с моделью СОМ выходит за рамки данной книги. Тем не менее две особенности, имеющие отношение к возможности взаимодей ствия с моделью СОМ, заслуживают краткого рассмотрения в этом разделе. Первая из них состоит в применении индексированных свойств, а вторая — в возможности пере давать аргументы значения тем COM-методам, которым требуется ссылка. Как вам должно быть уже известно, в C# свойство обычно связывается только с одним значением с помощью одного из аксессоров get или set. Но совсем иначе дело обсто ит со свойствами модели СОМ. Поэтому, начиная с версии C# 4.0, в качестве выхода из этого затруднительного положения во время работы с COM-объектом появилась воз можность пользоваться индексированным свойством для доступа к COM-свойству, име ющему несколько параметров. С этой целью имя свойства индексируется, почти так же, как это делается с помощью индексатора. Допустим, что имеется объект myXLApp, который относится к типу Microsoft.Office.Interop.Execl.Application. В прошлом для установки строкового значения "OК" в ячейках С1-СЗ электронной таблицы Excel можно было бы воспользоваться оператором, аналогичным следую щему.
myXLapp.get_Range("C1", "С3").set_Value(Type.Missing, "OK"); В этой строке кода интервал ячеек электронной таблицы получается при вызове метода get_Range, для чего достаточно указать начало и конец интервала. А значе ния задаются при вызове метода set_Value, для чего достаточно указать тип (что не обязательно) и конкретное значение. В этих методах используются свойства Range и Value, поскольку у обоих свойств имеются два параметра. Поэтому в прошлом к ним нельзя было обращаться как к свойствам, но приходилось пользоваться упомянутыми выше методами. Кроме того, аргумент Type.Missing служил в качестве обычного за полнителя, который передавался для указания на тип, используемый по умолчанию. Но, начиная с версии C# 4.0, появилась возможно переписать приведенный выше опе ратор, приведя его к следующей более удобной форме.