2013-02-15 1 views
0

Таким образом, System.Type имеет метод экземпляра под названием Attributes.Как работает Type.Attributes C#?

public TypeAttributes Attributes { get; } 

который возвращает enum типа TypeAttributes. Вот некоторые члены этого перечисления:

public enum TypeAttributes { 
    AnsiClass = 0, 
    Class = 0, 
    AutoLayout = 0, 
    NotPublic = 0, 
    Public = 1, 
    NestedPublic = 2, 
    NestedPrivate = 3, 
    NestedFamily = 4, 
    NestedAssembly = 5, 
    NestedFamANDAssem = 6, 
    VisibilityMask = 7, 
    NestedFamORAssem = 7, 
    SequentialLayout = 8, 
    ExplicitLayout = 16, 
    LayoutMask = 24, 
... 
} 

Но с другой стороны, Type класса имеет предоставляет слишком много свойств для большинства вещей появляются в этом перечислении:

  • IsPublic
  • IsClass
  • IsNestedFamANDAssem
  • IsAutoLayout
  • ...

Для чего именно Type.Attributes? Я предполагаю, что это не битмаскированное значение, поскольку оно является перечислением, и оно возвращает только один член перечисления. И это не статическое свойство на классе Type, так что же он делает?

ответ

2

Type.Attributes - это битмаскированное значение. Это даже says so in the documentation.

enum s обычно используются как типы данных флага, украшая их атрибутом Flags.

И те свойства Type, как IsPublic, IsClass и т. Д., Просто проверяйте эти флаги и возвращайте логическое значение. Вы можете сами увидеть это, посмотрев определения с помощью отражателя.

IsPublic, например, делает что-то вроде этого:

public bool IsPublic { 
    get { 
     return ((this.Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.Public); 
    } 
} 

Не все свойства Type обязательно представляют собой один из флагов, хотя (как IsEnum).

+0

Почему это делает бессмысленным перечисление, а не делает его «int»? –

+1

@ahmetalpbalkan - что вы имеете в виду «бессмысленное перечисление»? Как это будет 'int' сделать его более понятным? –

2

Я предполагаю, что это не bitmasked значение

Вы угадали неправильно. Он обозначен как FlagsAttribute:

Указывает, что перечисление можно рассматривать как битовое поле; то есть набор флагов.

Как вы указали, многие из них также доступны в качестве свойств. Итак, почему он разоблачен? Ну, во-первых, потому что это естественное представление этой информации. Свойства (например, IsPublic) просто скрыть тестирование бит для вас. И, во-вторых, иногда это более удобное значение для прохождения, чем массив логических элементов.

1

Это bitmasked значение, где части значения представляют partiular свойства типа -

  • myType.Attributes & TypeAttributes.VisibilityMask дает вам один из нескольких Public/непубличных/NestedPublic ... значений из перечисления
  • myType.Attributes & TypeAttributes.LayoutMask дает вам тип макета (последовательный/явный/по умолчанию)

и так далее.

Смежные вопросы