2017-08-22 64 views
1

試圖將以下代碼行用.NET Framework 4.0創建爲.NET Core 1.1IHasXmlNode .net core 1.x

XmlDocument doc = new XmlDocument(); 
XmlNode node = ((IHasXmlNode)doc.CreateNavigator()).GetNode(); 

錯誤

類型或命名空間名稱 'IHasXmlNode' 找不到

IHasXmlNodeseems to be available因爲.NET Core 2

我可以檢索當前節點GetNode()XPathNavigator.NET Core 1.1

+0

如果這是* actual *代碼,它看起來像編寫'doc.DocumentElement'的過於複雜的方式。 –

+0

@JeroenMostert這只是代碼的簡化版本。 – tchelidze

+0

細節很重要,因爲在涉及到XML導航時,幾乎總是有不止一種方式來剝皮貓。 (我錯了:*寫成*的行*只是返回原始的'XmlDocument',所以你明白爲什麼要求細節不是毫無意義的。如果你可以簡化整個表達式的存在,很容易使它工作......) –

回答

2

.NET核心1.1沒有IHasXmlNode,但它確實有實現它的傳真所需的所有成分:

#if NETCOREAPP1_1 
    class IHasXmlNode { 
    readonly MethodInfo getNode; 
    readonly XPathNavigator navigator; 
    IHasXmlNode(XPathNavigator navigator) { 
     this.navigator = navigator; 
     this.getNode = navigator.GetType().GetTypeInfo().GetMethod("GetNode", BindingFlags.Instance | BindingFlags.NonPublic); 
     if (this.getNode == null) { 
      throw new InvalidCastException($"{navigator.GetType()} cannot implement IHasXmlNode as it does not have a GetNode method."); 
     }; 
    } 

    public XmlNode GetNode() { 
     return (XmlNode) getNode.Invoke(navigator, new object[] { }); 
    } 

    public static implicit operator IHasXmlNode(XPathNavigator navigator) { 
     return new IHasXmlNode(navigator); 
    } 
    } 
#endif 

該類不是一個下拉更換爲IHasXmlNode(因爲它不是一個真正的接口,所以像isas這樣的運營商將失敗),但它會產生簡單地轉換工作的代碼。如有必要,反射可以用Linq.Expressions進行優化。