.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
(因爲它不是一個真正的接口,所以像is
和as
這樣的運營商將失敗),但它會產生簡單地轉換工作的代碼。如有必要,反射可以用Linq.Expressions
進行優化。
如果這是* actual *代碼,它看起來像編寫'doc.DocumentElement'的過於複雜的方式。 –
@JeroenMostert這只是代碼的簡化版本。 – tchelidze
細節很重要,因爲在涉及到XML導航時,幾乎總是有不止一種方式來剝皮貓。 (我錯了:*寫成*的行*只是返回原始的'XmlDocument',所以你明白爲什麼要求細節不是毫無意義的。如果你可以簡化整個表達式的存在,很容易使它工作......) –