Рефлексия: странно запускается метод
Господа, есть такой код:
using System;
using System.Reflection;
class a
{
public a()
{
Console.WriteLine(1);
}
public a(int x)
{
Console.WriteLine(x);
}
public a(bool b, double z)
{
Console.WriteLine("Bla");
}
public void Z()
{
Console.WriteLine("Z");
}
public void S(int x)
{
Console.WriteLine("S");
}
public int Z(int z)
{
Console.WriteLine("int Z"); return 5;
}
public void S(double z)
{
Console.WriteLine("double s");
}
}
class b
{
static void Main()
{
ConstructorInfo[] ci = typeof(a).GetConstructors();
MethodInfo[] mi = typeof(a).GetMethods();
foreach (ConstructorInfo CI in ci)
{
ParameterInfo[] pi = CI.GetParameters();
if (pi.Length == 1 && pi[0].ParameterType.Name == typeof(int).Name)
{
object[] o = new object[pi.Length];
o[pi.Length - 1] = 4;
foreach (MethodInfo MI in mi)
{
ParameterInfo[] MPI = MI.GetParameters();
if (MPI.Length == 0)
{
MI.Invoke(CI.Invoke(o), null);
}
if (MI.ReturnParameter.Name == typeof(int).Name && MPI.Length == 1)
{
object[] mo = new object[1] { 6 };
MI.Invoke(CI.Invoke(o), mo);
}
}
}
}
}
}
Здесь я пробую, как работает рефлексивный вызов метода и создание объекта. Однако я наткнулся на чудеса в c#. Прогоняя программу в пошаговом режиме, я вижу, как программа в первый раз вызывает инструкцию:
if (MPI.Length == 0)
{
MI.Invoke(CI.Invoke(o), null);
}
Ну и, как следствие, создается объект (при этом выводится на консоль цифра 4) и запускается соответствующий метод (который выводит букву Z). Однако при дальнейшей пошаговой отладке я вижу, как компилятор опять входит в эту инструкцию, но при этом создается объект (и выводится цифра 4), НО НЕ запускается метод. ПОЧЕМУ?
То есть я ожидаю вывода на консоль что-то типа
4Z4Z4Z и т. д. А получаю 4Z444.