Добавить в цитаты Настройки чтения

Страница 264 из 502

<b>        case 1: // один аргумент</b>

<b>          if (pi[0].ParameterType == typeof(int)) {</b>

<b>            object[] args = new object[1];</b>

<b>            args[0] = 14;</b>

<b>            if ((bool)m.Invoke(reflectOb, args))</b>

<b>              Console.WriteLine(&quot;Значение 14 находится между x и у&quot;);</b>

<b>            else</b>

<b>              Console.WriteLine(&quot;Значение 14 не находится между х и у&quot;);</b>

<b>          }</b>

<b>          break;</b>

<b>        case 2: // два аргумента</b>

<b>          if ((pi[0].ParameterType == typeof(int)) &amp;&amp;</b>

<b>                    (pi[1].ParameterType == typeof(int))) {</b>

<b>            object[] args = new object[2];</b>

<b>            args[0] = 9;</b>

<b>            args[1] = 18;</b>

<b>            m.Invoke(reflectOb, args);</b>

<b>          }</b>

<b>          else if ((pi[0].ParameterType == typeof(double)) &amp;&amp;</b>

<b>                    (pi[1].ParameterType == typeof(double))) {</b>

<b>            object[] args = new object[2];</b>

<b>            args[0] = 1.12;</b>

<b>            args[1] = 23.4;</b>

<b>            m.Invoke(reflectOb, args);</b>

<b>          }</b>

<b>          break;</b>

<b>      }</b>

<b>      Console.WriteLine();</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

Эта программа дает следующий результат.

<b>Использовано: MyClass</b>

<b>Конструирование класса MyClass(int).</b>

<b>Значение х: 10, значение у: 10</b>

<b>Вызов методов для объекта reflectOb.</b>

<b>Вызов метода Sum</b>

<b>Результат: 20</b>

<b>Вызов метода IsBetween</b>

<b>Значение 14 не находится между х и у</b>

<b>Вызов метода Set</b>

<b>В методе Set (int, int). Значение х: 9, значение у: 18</b>

<b>Вызов метода Set</b>

<b>В методе Set(double, double). Значение х: 1, значение у: 23</b>

<b>Вызов метода Show</b>

<b>Значение х: 1, значение у: 23</b>

Эта программа работает довольно просто, но все же требует некоторых пояснений. Во-первых, получаются и используются только те методы, которые явно объявлены в классе MyClass. Для этой цели служит форма BindingFlags метода GetMethods(), чтобы воспрепятствовать вызову методов, наследуемых от объекта. И во-вторых, количество параметров и возвращаемый тип каждого метода получаются динамически, а затем определяются и проверяются в операторе switch. На основании этой информации формируется вызов каждого метода.

Атрибуты

В C# разрешается вводить в программу информацию декларативного характера в форме атрибута, с помощью которого определяются дополнительные сведения (метаданные), связанные с классом, структурой, методом и т.д. Например, в программе можно указать атрибут, определяющий тип кнопки, которую должен отображать конкретный класс. Атрибуты указываются в квадратных скобках перед тем элементом, к которому они применяются. Следовательно, атрибут не является членом класса, но обозначает дополнительную информацию, присоединяемую к элементу.

Атрибут поддерживается классом, наследующим от класса System.Attribute. Поэтому классы атрибутов должны быть подклассами класса Attribute. В классе Attribute определены основные функциональные возможности, но далеко не все они нужны для работы с атрибутами. В именах классов атрибутов принято употреблять суффикс Attribute. Например, ErrorAttribute — это имя класса атрибута, описывающего ошибку.

При объявлении класса атрибута перед его именем указывается атрибут AttributeUsage. Этот встроенный атрибут обозначает типы элементов, к которым может применяться объявляемый атрибут. Так, применение атрибута может ограничиваться одними методами.

В классе атрибута определяются члены, поддерживающие атрибут. Классы атрибутов зачастую оказываются довольно простыми и содержат небольшое количество полей или свойств. Например, атрибут может определять примечание, описывающее элемент, к которому присоединяется атрибут. Такой атрибут может принимать следующий вид.

<b>  [AttributeUsage(AttributeTargets.All) ]</b>

<b>public class RemarkAttribute : Attribute {</b>

<b>  string pri_remark; // базовое поле свойства Remark</b>

<b>  public RemarkAttribute(string comment) {</b>