Вызов конструкторов с параметрами, рассмотренный выше, является частным случаем динамического вызова методов. Вызов остальных методов производится без помощи дополнительных классов типа Activator. Этим занимается сам класс Type.
Динамический вызов метода динамически созданного объекта:
static void Main()
{ // Получаем объект-тип для System.Drawing.Rectangle
Assembly a = Assembly.LoadWithPartialName("System.Drawing");
AssemblyName an = a.GetName();
Type typeRect = Type.GetType("System.Drawing.Rectangle,"
+ an.FullName, true);
// Готовим параметры для вызова конструктора
// Rectangle(Int32 x, Int32 y, Int32 width, Int32 height);
object[] ctorArgs = { 10, 10, 100, 100 };
Object rect = Activator.CreateInstance(typeRect, ctorArgs, null);
// Выводим поля динамически созданного объекта
Console.WriteLine(Trace1.ObjectFields("rect", rect));
// Готовим параметры вызова метода Boolean Contains(Point pt);
System.Drawing.Point point = new System.Drawing.Point(50, 50);
object[] argContains = { point };
object contain = typeRect.InvokeMember("Contains"
, BindingFlags.Public
| BindingFlags.InvokeMethod
| BindingFlags.Instance
, null
, rect
, argContains
);
Console.WriteLine( contain.Equals(true) ?
"contains" : "does not contain");
Console.WriteLine(Trace1.ObjectFields("point", point));
Console.ReadLine();
}
Если вызываемый метод перегружен, будет вызван тот вариант метода, который имеет те же типы параметров, причем в том же порядке, что и типы элементов переданного массива параметров.