Для вызова методов динамически созданного объекта можно применять гораздо более удобный и эффективный способ. Правда, этот способ работает, только если разработчик знаете, что объект реализует известный ему на момент компиляции интерфейс.
Использование динамически созданного объекта через интерфейс:
static void Main()
{ // Получаем объект-тип для System.Drawing.SolidBrush
Assembly a = Assembly.LoadWithPartialName("System.Drawing");
AssemblyName an = a.GetName();
Type typeBrush = Type.GetType("System.Drawing.SolidBrush,"
+ an.FullName, true);
// Готовим параметры для вызова конструктора
// SolidBrush(Color color);
object[] ctorArgs2 = { System.Drawing.Color.Blue };
Object brush = Activator.CreateInstance(typeBrush
, ctorArgs2, null);
// Выводим поля динамически созданного объекта
Console.WriteLine(Trace1.ObjectFields("brush", brush));
// Получаем ссылку на интерфейс
ICloneable cloner = brush as ICloneable;
if (cloner != null)
{ Object brushCloned = cloner.Clone();
Console.WriteLine(Trace1.ObjectFields("brushCloned"
, brushCloned));
}
Console.ReadLine();
}
Очевидно, что эффективность вызова метода динамически созданного объекта через интерфейс гораздо выше, чем через InvokeMember, ведь это обычный вызов виртуального метода. Поэтому, если есть такая возможность, лучше использовать интерфейсы.
Для получения ссылки на интерфейс ICloneable здесь применяется операция as языка C#. Эта операция возвращает ссылку на интерфейс, если он реализован объектом. Если объект не поддерживает данный интерфейс, будет возвращена пустая ссылка (null). Ниже будут подробнее рассмотрены другие способы динамического приведения типов.