C#的Type.Attributes如何工作?

时间:2013-02-15 07:24:15

标签: c# .net system.reflection

因此System.Type有一个名为Attributes的实例方法。

public TypeAttributes Attributes { get; }

返回enum类型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到底是什么意思?我猜它不是一个带掩码的值,因为它是一个枚举,它只返回枚举的一个成员。这不是{{1}}类的静态属性,那究竟是什么呢?

3 个答案:

答案 0 :(得分:2)

  

我猜这不是一个带位掩码的值

你错了。它标记为FlagsAttribute

  

表示可以将枚举视为位字段;也就是说,一组标志。

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

答案 1 :(得分:2)

Type.Attributes是一个位掩码值。它甚至says so in the documentation

enum通常通过使用Flags属性进行装饰来用作标记数据类型。

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

IsPublic,例如做类似的事情:

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

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

答案 2 :(得分:1)

它是一个位掩码值,其中值的某些部分代表Type -

的特殊属性
  • myType.Attributes & TypeAttributes.VisibilityMask为您提供枚举中的几个Public / NonPublic / NestedPublic ...值之一
  • myType.Attributes & TypeAttributes.LayoutMask为您提供布局类型(Sequential / Explicit / default)

等等。