我正在使用IMetaDataImport
API,我需要確定我的程序集中的類型定義是值類型還是引用類型。我沒有在API中找到明確提供這些信息的方法。但是,我可以很容易地獲得基本類型,並檢查它是否爲System.ValueType
。如何確定類型是否是CLI元數據的值類型?
我的問題是:基類是通過哪種CLI元數據編碼的事實,即一個類型是一個值類型還是有一些標誌爲這個地方?
我正在使用IMetaDataImport
API,我需要確定我的程序集中的類型定義是值類型還是引用類型。我沒有在API中找到明確提供這些信息的方法。但是,我可以很容易地獲得基本類型,並檢查它是否爲System.ValueType
。如何確定類型是否是CLI元數據的值類型?
我的問題是:基類是通過哪種CLI元數據編碼的事實,即一個類型是一個值類型還是有一些標誌爲這個地方?
沒有直接標識值類型的標誌。它看起來像檢查基本類型,以及其他一些事情,是執行它的規範方法。所述ECMA CLI spec的
節II.10.1.3描述類型定義是這樣的:
類型語義屬性指定的接口,類或 值類型是否應該定義。 接口屬性指定了一個 接口。如果該屬性不存在且定義擴展爲 (直接或間接)
System.ValueType
,並且定義不是 對於System.Enum
,則應定義值類型。否則,應定義類 。
Type.IsValueType
property您要找的是什麼?
不完全,此屬性存在的事實並不表示元數據直接顯示此值。然而,你給了我這個想法來看看Mono的這個屬性的實現,它的indeeds證實了值類型是通過檢查繼承鏈來確定的。 – Trillian
很酷,很清楚!不過,「間接」部分有點令人驚訝。它是否僅指從「System.Enum」繼承的枚舉?我沒有看到任何其他合法形式的間接'System.ValueType'繼承。 – Trillian
@Trillian:是的,我認爲是的。 'System.ValueType'是一個類的類型,'System.Enum'本身是一個從'System.ValueType'繼承的類的類型,但是這個繼承層次結構中的任何東西都是一個值類型。 – LukeH