2017-03-24 70 views
0

我需要將類作爲子類轉換。爲什麼,因爲我有很多代碼似乎通過interop做到這一點。我想刪除互操作並不更新任何代碼。爲了替換通過interop使用MSXML的代碼,我想編寫一個「本機」代碼/類集,它只是在封面下使用XmlDocument,並且具有100%的API規範(用於我們正在使用的),因此我可以刪除interop dll並在本土100%。 (當然,我想我支付的參考資金,但應該低於互操作成本,我可以做內存調試更容易,因爲它都在託管堆,對不對?).net,鑄造類作爲子類

看着MSXML6 interop,看來你可以投一個IXMLDOMNode作爲IXMLDOMElement。然而IXMLDOMElement被定義爲:

public interface IXMLDOMElement : IXMLDOMNode 

具體而言,我可以就好了運行此代碼:

Dim myXml As FreeThreadedDOMDocument60 = New FreeThreadedDOMDocument60() 
    myXml.loadXML("<root><a>1</a><a>2</a></root>") 
    Dim oExtPropWideNode As IXMLDOMElement = DirectCast(myXml.selectSingleNode("/root/a"), IXMLDOMElement) 
    Console.WriteLine(oExtPropWideNode.text) 

我爲什麼可以運行呢? selectSingleNode返回(基類)IXMLDOMNode並將其轉換爲(子類)IXMLDOMElement

這是一些掛羊頭賣狗肉,我需要弄清楚,因爲它的接口互操作水平,我不能在本土模仿的能力/使用,或sneakiness?

最接近實際運行代碼的是使用IConvertible和Convert.ChangeType,但這需要更改語法/代碼,這是我想避免的。

+0

感謝DarkSquirrel42,這是瘋狂的,我認爲一個方法將返回一個IXMLDOMNode類型,但它返回的實例實際上是實施「子接口」 IXMLDOMElement對象實例。 但我想這只是說,「我有一個方法,至少會返回一個ICar,但我很可能會返回一個IRaceCar」。 謝謝先生! – GeoLord

+0

再次感謝,現在一切都好。而要回答你的問題,「它實現IXMLDOMElement」,那是一點很難知道,因爲它是系統.__ ComObject,但使用VB的TypeName函數我的確可以看到它真正的「IXMLDOMElement」。 – GeoLord

回答

1

IXMDOMNode和IXMLDOMEElement沒有類,但接口...它們之間強制轉換的能力取決於實現IXMLDOMNode的類...它是否實現IXMLDOMElement?那麼你可以施放...

+0

OOP 101!面向對象編程。 – athar13