.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
で最適化することができます。
*実際の*コードの場合は、 'doc.DocumentElement'を書くのがとても複雑です。 –
@ JeroenMostertこれは、問題を回避したコードの単純化されたバージョンです。 – tchelidze
詳細は重要です。なぜなら、XMLナビゲーションに関しては、ほとんど常に猫をスキンする方法が複数あるからです。 (私は間違っていました:書かれた*は元の 'XmlDocument'を返すので、なぜ詳細を尋ねるのは無意味ではないのが分かります。 –