public override Boolean Equals(Object obj)
        {
            // Если в базовом классе реализован метод Equals и это
            // не класс Object, раскомментируйте следующую строку
            // if (!base.Equals(obj)) return false;
            // Так как 'this' не равен null, при obj равном null
            // объекты не совпадают
            // ПРИМЕЧАНИЕ. Эту строку можно удалить, если вы считаете,
            // что базовый тип корректно реализует метод Equals
            if (obj == null)
            {
                return(false);
            }
            // Объекты разных типов не могут совпасть
            // ПРИМЕЧАНИЕ. Эту строку можно удалить, если вы считаете,
            // что базовый тип корректно реализует метод Equals
            if (this.GetType() != obj.GetType())
            {
                return(false);
            }
            // Приведение obj к нашему типу для получения доступа к полям
            // ПРИМЕЧАНИЕ. Это приведение работает всегда,
            // так как объекты принадлежат к одному типу
            AccountsAttribute other = (AccountsAttribute)obj;

            // Сравнение значений полей 'this' и other
            if (other.m_accounts != m_accounts)
            {
                return(false);
            }
            return(true); // Объекты совпадают
        }
        public override Boolean Match(Object obj)
        {
            // Если в базовом классе реализован метод Match и это не
            // класс Attribute, раскомментируйте следующую строку
            // if (!base.Match(obj)) return false;
            // Так как 'this' не равен null, если obj равен null,
            // объекты не совпадают
            // ПРИМЕЧАНИЕ. Эту строку можно удалить, если вы считаете,
            // что базовый тип корректно реализует метод Match
            if (obj == null)
            {
                return(false);
            }
            // Объекты разных типов не могут быть равны
            // ПРИМЕЧАНИЕ. Эту строку можно удалить, если вы считаете,
            // что базовый тип корректно реализует метод Match
            if (this.GetType() != obj.GetType())
            {
                return(false);
            }
            // Приведение obj к нашему типу для доступа к полям
            // ПРИМЕЧАНИЕ. Это приведение всегда работает,
            // так как объекты принадлежат к одному типу
            AccountsAttribute other = (AccountsAttribute)obj;

            // Сравнение полей
            // Проверка, является ли accounts 'this' подмножеством
            // accounts объекта others
            if ((other.m_accounts & m_accounts) != m_accounts)
            {
                return(false);
            }
            return(true); // Объекты совпадают
        }
        private static void CanWriteCheck(Object obj)
        {
            // Создание и инициализация экземпляра типа атрибута
            Attribute checking = new AccountsAttribute(Accounts.Checking);
            // Создание экземпляра атрибута, примененного к типу
            Attribute validAccounts =
                obj.GetType().GetCustomAttribute <AccountsAttribute>(false);

            // Если атрибут применен к типу и указывает на счет "Checking",
            // значит, тип может выписывать чеки
            if ((validAccounts != null) && checking.Match(validAccounts))
            {
                Console.WriteLine("{0} types can write checks.", obj.GetType());
            }
            else
            {
                Console.WriteLine("{0} types can NOT write checks.", obj.GetType());
            }
        }
 private static void CanWriteCheck(Object obj)
 {
     // Создание и инициализация экземпляра типа атрибута
     Attribute checking = new AccountsAttribute(Accounts.Checking);
     // Создание экземпляра атрибута, примененного к типу
     Attribute validAccounts =
     obj.GetType().GetCustomAttribute<AccountsAttribute>(false);
     // Если атрибут применен к типу и указывает на счет "Checking",
     // значит, тип может выписывать чеки
     if ((validAccounts != null) && checking.Match(validAccounts))
     {
         Console.WriteLine("{0} types can write checks.", obj.GetType());
     }
     else
     {
         Console.WriteLine("{0} types can NOT write checks.", obj.GetType());
     }
 }