break;
case 1: // один аргумент
if (pi[0] .ParameterType == typeof(int)) { object[] args = new object[1]; args[0] = 14;
if ((bool) m.Invoke(reflectOb, args))
Console.WriteLine ("Значение 14 находится между x и у"); else
Console.WriteLine ("Значение 14 не находится между х и у");
}
break;
case 2: // два аргумента
if((pi[0].ParameterType == typeof(int)) &&
(pi[1].ParameterType == typeof(int))) {
object[] args = new object[2]; args[0] = 9;
args[l] = 18;
m.Invoke(reflectOb, args);
}
else if((pi[0].ParameterType == typeof(double)) &&
(pi[1].ParameterType == typeof(double))) {
object[] args = new object [2]; args[0] = 1J12; args[l] = 23.4; m.Invoke(reflectOb, args);
}
break;
}
Console.WriteLine;
}
}
}
Эта программа дает следующий результат.
Использовано: MyClass Конструирование класса MyClass(int).
Значение х: 10, значение у: 10
Вызов методов для объекта reflectOb.
Вызов метода Sum Результат: 20
Вызов метода IsBetween
Значение 14 не находится между х и у
Вызов метода Set
В методе Set (int, int). Значение х: 9, значение у: 18 Вызов метода Set
В методе Set(double, double). Значение х: 1, значение у: 23
Вызов метода Show
Значение х: 1, значение у: 23
Эта программа работает довольно просто, но все же требует некоторых пояснений. Во-первых, получаются и используются только те методы, которые явно объявлены в классеMyClass.Для этой цели служит формаBindingFlagsметодаGetMethods ,чтобы воспрепятствовать вызову методов, наследуемых от объекта. И во-вторых, количество параметров и возвращаемый тип каждого метода получаются динамически, а затем определяются и проверяются в оператореswitch.На основании этой информации формируется вызов каждого метода.
Атрибуты
В C# разрешается вводить в программу информацию декларативного характера в форме
Основы применения атрибутов