2016-12-07 1 views
2

XAttributeおよびXElementは両方ともXObjectタイプに由来します。XAttributeとXElementのメソッドを記述することはできますか?

両方ともValueプロパティを持っています。

はこれまでのところ、これは私がやりたいと作ってみたものです:

string FooMyXObject(XObject bar){ 
    if (bar.NodeType == NodeType.Element) 
     return (bar as XElement).Value; 
    else if (bar.NodeType == NodeType.XAttribute) 
     return (bar as XAttribute).Value; 
    else 
     throw new Exception("Generic Fail Message"); 
} 

これは不格好な感じ。私はこれをより鈍いものにするための方法があることを願っています。 XObjectからValueプロパティにアクセスするには、両方とも文字列プロパティー名Valueがあるためです。

これは可能ですか、それとも私はちょうどこのように頑張ってやっていますか?

+1

['XText'](https://msdn.microsoft.com/en-us/library/system.xml.linq.xtext(v = vs.110).aspx)と[' XComment'](https ://msdn.microsoft.com/en-us/library/system.xml.linq.xcomment(v = vs.110).aspx)には、共通基本クラスのない「Value」プロパティもあります。それは本当に少し迷惑です。これはまさにIHasValueインターフェースが適切であった状況です。 – dbc

答えて

2

のためにあなたが別々の枝を避けるためにdynamicbarをキャストすることができます:

string FooMyXObject(XObject bar){ 
    if (bar.NodeType == NodeType.Element || bar.NodeType == NodeType.XAttribute) 
     return ((dynamic)bar).Value; 
    else 
     throw new Exception("Generic Fail Message"); 
} 
+0

私はこれが好きです。確かに私がやっていたことより優れています( 'GetType().GetProperty(" Value ").GetValue(Bar).ToString()'アプローチ)。 – Will

+0

このように 'dynamic'を使用すると、パフォーマンスが低下します。彼の質問でOPによって提供されるコードは、パフォーマンスの点でより良く動作し、私は代わりにそれを使用することを提案したいと思います。 – MarcinJuraszek

2

XObjectに.Valueプロパティが定義されている場合、これをジェネリックを使って簡単に書くことができます。

すなわち

string FooMyXObject<T>(T bar) where T : XObject 
{ 
    return bar.Value; 
} 

が一致しない場合は、それが派生クラスの一般的な機能であるならば、あなたは、基本クラスにそれを移動することを検討すべきです。

編集: Valueプロパティが基本クラスにない場合は、コードが大丈夫です。

string FooMyXObject(XObject bar) 
{ 
    switch(bar.NodeType) 
    { 
     case NodeType.Element: 
      return (bar as XElement).Value; 
     case NodeType.XAttribute: 
      return (bar as XAttribute).Value; 
     default: 
      throw new Exception("Generic Fail Message"); 
    } 
} 

またはちょうど楽しみ

string FooMyXObject(XObject bar) 
    { 
     try 
     { 
      dynamic temp = bar; 
      return temp.Value; 
     } 
     catch() 
     { 
      throw new Exception("Generic Fail Message"); 
     } 
    } 
+1

'Value'は' XObject'型で定義されたプロパティではありません。 – Will

0

たぶん、あなたはそう簡単に拡張のためのケースを使用して同じようにリファクタリングができ@meganautと@dasblinkenlightによって与えられた答えはどちらも正しいですが、もっと言いたいことがあります。

System.Linq.Xml名前空間に

XElementXAttributeは共にXObjectを拡張するが、それらはそれぞれ別々にValueプロパティを定義するので、この分岐の種類やdynamicタイプの使用が必要です。

他のオブジェクトモデルでは、@meganautが示唆しているのと同様のシナリオでジェネリックを使用することができます。

関連する問題