0

所以System.Type有一个名为Attributes的实例方法。

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类的静态属性,那么它到底是做什么的呢?

4

3 回答 3

2

我猜这不是位掩码值

你猜错了。它被标记为FlagsAttribute

表示可以将枚举视为位域;即一组标志。

正如您所指出的,其中许多也可作为属性使用。那么,为什么会暴露呢?嗯,首先,因为它是这些信息的自然表示。属性(例如IsPublic)只是为您隐藏位测试。其次,有时传递一个比布尔数组更方便的值。

于 2013-02-15T07:36:20.697 回答
2

Type.Attributes是一个位掩码值。它甚至在文档中这么说

enums 通常用作 Flag 数据类型,通过使用Flags属性来装饰它们。

Type, likeIsPublic等的那些属性IsClass只是检查这些标志并返回一个布尔值。您可以通过使用反射器查看定义来自己查看。

IsPublic,例如做这样的事情:

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

并非所有属性都Type必须代表其中一个标志(如IsEnum)。

于 2013-02-15T07:37:15.040 回答
1

它是位掩码值,其中部分值表示类型的特定属性 -

  • myType.Attributes & TypeAttributes.VisibilityMask为您提供枚举中的几个 Public/NonPublic/NestedPublic... 值之一
  • myType.Attributes & TypeAttributes.LayoutMask为您提供布局类型(顺序/显式/默认)

等等。

于 2013-02-15T07:42:25.623 回答