2017-08-22 10 views
1

.NET Framework 4.0から.NET Core 1.1で作成された次のコード行を移植しようとしています。IHasXmlNode .net core 1.x

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

型または名前空間名 'IHasXmlNode' は

iは、現在のノードを取得することができ

IHasXmlNodeseems to be available.NET Core 2ので、見つかりませんでした

エラーGetNode()からの.NET Core 1.1

+0

*実際の*コードの場合は、 '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で最適化することができます。

関連する問題