2012-06-30 64 views
1

我正在使用IMetaDataImport API,我需要確定我的程序集中的類型定義是值類型還是引用類型。我沒有在API中找到明確提供這些信息的方法。但是,我可以很容易地獲得基本類型,並檢查它是否爲System.ValueType如何確定類型是否是CLI元數據的值類型?

我的問題是:基類是通過哪種CLI元數據編碼的事實,即一個類型是一個值類型還是有一些標誌爲這個地方?

回答

1

沒有直接標識值類型的標誌。它看起來像檢查基本類型,以及其他一些事情,是執行它的規範方法。所述ECMA CLI spec

節II.10.1.3描述類型定義是這樣的:

類型語義屬性指定的接口,類或 值類型是否應該定義。 接口屬性指定了一個 接口。如果該屬性不存在且定義擴展爲 (直接或間接)System.ValueType,並且定義不是 對於System.Enum,則應定義值類型。否則,應定義類 。

+0

很酷,很清楚!不過,「間接」部分有點令人驚訝。它是否僅指從「System.Enum」繼承的枚舉?我沒有看到任何其他合法形式的間接'System.ValueType'繼承。 – Trillian

+0

@Trillian:是的,我認爲是的。 'System.ValueType'是一個類的類型,'System.Enum'本身是一個從'System.ValueType'繼承的類的類型,但是這個繼承層次結構中的任何東西都是一個值類型。 – LukeH

0

Type.IsValueType property您要找的是什麼?

+0

不完全,此屬性存在的事實並不表示元數據直接顯示此值。然而,你給了我這個想法來看看Mono的這個屬性的實現,它的indeeds證實了值類型是通過檢查繼承鏈來確定的。 – Trillian

相關問題