我需要将类强制转换为子类。为什么,因为我有很多代码似乎通过互操作来做到这一点。我想删除互操作,不更新任何代码。要通过interop替换使用MSXML的代码,我想编写一组“本机”代码/类,只使用XmlDocument,并且具有100%api规范(我们正在使用的),所以我可以删除interop dll并在本土100%。 (当然我想我支付参考费用,但这应该小于互操作成本,我可以更容易地进行内存调试,因为它都在托管堆上,对吧?)
查看MSXML6互操作,似乎可以将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 。
这是一些我需要弄清楚的诡计,因为它是接口的能力/用法,或者我无法在本土模仿的互操作级别的狡猾吗?
我最接近实际运行代码的方法是使用IConvertible和Convert.ChangeType,但这需要更改语法/代码,我想避免这种情况。
答案 0 :(得分:1)
IXMDOMNode和IXMLDOMEElement都没有类,但接口......在它们之间强制转换的能力取决于实现IXMLDOMNode的类...它是否实现了IXMLDOMElement?然后你可以施展...