2013-02-15 46 views
0

所以System.Type有一個實例方法稱爲AttributesC#的Type.Attribute如何工作?

public TypeAttributes Attributes { get; } 

返回TypeAttributes類型的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?我想這不是一個bitmasked值,因爲它是一個枚舉,它只返回一個枚舉的成員。並且這不是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類型的? – 2013-02-18 21:53:12

+1

@ahmetalpbalkan - 你是什麼意思「無意義的枚舉」? 「int」會如何變得更有意義? – 2013-02-19 06:36:38

2

我想這不是一個bitmasked值

你猜錯了。它被標記爲FlagsAttribute

指示一個枚舉可以被視爲一個位域;也就是一組標誌。

如您所示,其中許多屬性也可用。那麼,爲什麼暴露?那麼,首先,因爲這是這些信息的自然表現。這些屬性(例如IsPublic)只是爲您隱藏測試。其次,有時候傳遞比布爾變量更方便。

1

據bitmasked值,其中值的部分代表類型的partiular性能 - 從枚舉

  • myType.Attributes & TypeAttributes.LayoutMask給你

    • myType.Attributes & TypeAttributes.VisibilityMask給你一個數公開/非公開/ NestedPublic的...值佈局類型(Sequential/Explicit/default)

    等等。