2011-10-14 19 views
1

我首先說的是,我假定靜態數組初始化器被編譯器轉換爲私有嵌套類,通常使用__StaticArrayInitTypeSize=12等名稱。據我瞭解,在閱讀this extremely informative article時,這些私有類是值類型,並且它們沒有使用CompilerGeneratedAttribute類標記。如何辨別Type是否爲靜態數組初始值設定項?

我正在處理需要處理某些類型並忽略其他類型的項目。

我必須能夠處理自定義結構類型,它像生成的靜態數組初始化類一樣是值類型。我必須忽略生成的靜態數組初始化類。我也必須忽略枚舉和代表。

我拉着這些類使用LINQ,就像這樣:

var typesToProcess = allTypes.Where(type => !type.IsEnum && 
              !type.IsArray && 
              !type.IsSubclassOf(typeof(Delegate))); 

我相當肯定的是,IsArray財產不是我認爲它是。無論如何,生成的靜態數組初始化類仍然顯示在typesToProcess Enumerable中。

還有其他人處理過嗎?我如何辨別自定義結構和生成的靜態數組初始化類之間的區別?我可以通過將類型名稱與__StaticArrayInitTypeSize進行字符串比較來破解它,但是有沒有更清晰的解決方案?

回答

1

嗯,剛剛與C#編譯器4試了一下我自己,我得到了一個內部稱爲<PrivateImplementationDetails>{D1E23401-19BC-4B4E-8CC5-2C6DDEE7B97C}包含了一個私有嵌套結構稱爲__StaticArrayInitTypeSize=12

該類包含一個名爲$$method0x6000001-1的結構類型的內部靜態字段。該領域本身用CompilerGeneratedAttribute裝飾。

問題是,這是所有這是實現特定的。它可能在未來的版本中發生變化,或者它也可能與以前的版本不同。

含有<>=已經由編譯器生成的,因此可以看到作爲一種隱含CompilerGenerated,如果這是任何使用「無法形容」名稱的任何成員名稱。 (其他用於此類生成的類型)

+0

一位同事凝視着我的肩膀評論道:「哇,您問了一個值得Jon Skeet回答的問題嗎?」。我確實將通過檢查禁止的字符的成員名稱向前移動。謝謝你的幫助! –

+0

@ R.MichaelRogers:LOL。只是要小心,如果你需要處理*一些*編譯器生成的類型,但不是全部:( –

相關問題