是否可以为XAttribute AND XElement编写方法?

时间:2016-12-07 04:31:15

标签: c# xml types type-conversion

XAttributeXElement都来自XObject类型。

两者都有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" );
}

这感觉很笨重。我希望有一些方法可以让它变得不那么笨重。从Value访问XObject属性的一些方法,因为它们都具有字符串属性名Value

这是可能的,还是我只是被迫以如此笨重的方式做到这一点?

3 个答案:

答案 0 :(得分: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 :(得分:2)

您可以将bar投射到dynamic以避免单独的分支:

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

答案 2 :(得分:0)

@meganaut和@dasblinkenlight给出的答案都是正确的,但还有更多要说的。

System.Linq.Xml命名空间中,XElementXAttribute都延伸XObject,但它们分别定义了Value属性,因此这种分支或需要使用dynamic类型。

在其他对象模型中,泛型可能在@meganaut建议的类似场景中可用。