2016-12-07 80 views
2

XAttributeXElement都源自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

你可以施放bardynamic避免單獨的分支:

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提供的類似場景中的泛型也可以使用。

相關問題