Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以为XAttribute和XElement编写一个方法?_C#_Xml_Types_Type Conversion - Fatal编程技术网

C# 是否可以为XAttribute和XElement编写一个方法?

C# 是否可以为XAttribute和XElement编写一个方法?,c#,xml,types,type-conversion,C#,Xml,Types,Type Conversion,XAttribute和XElement都派生自XObject类型 两者都有值属性 到目前为止,这就是我想做的事情: string FooMyXObject( XObject bar ){ if ( bar.NodeType == NodeType.Element ) return ( bar as XElement ).Value; else if ( bar.NodeType == NodeType.XAttribute ) return ( b

XAttribute
XElement
都派生自
XObject
类型

两者都有
属性

到目前为止,这就是我想做的事情:

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


这是可能的,还是我只是被迫以这种笨拙的方式来做呢?

如果.Value属性是在XObject上定义的,那么您可以非常简单地使用泛型来编写它

i、 e

或者只是为了好玩

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

您可以将
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" );
}

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

System.Linq.Xml
命名空间中,
XElement
XAttribute
都扩展了
XObject
,但它们各自单独定义了
属性,因此需要这种分支或使用
动态
类型


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

我喜欢这样。它肯定比我之前做的(以及
GetType().GetProperty(“Value”).GetValue(Bar).ToString()
方法)要好。像这样使用
dynamic
会对性能产生影响。OP在问题中提供的代码在性能方面会表现得更好,我建议改用它。
Value
不是在
XObject
类型上定义的属性。并且还有一个
属性,没有公共基类。真的有点烦人。这正是界面
IHasValue
适用的情况。
string FooMyXObject(XObject bar)
    {
       try
       {
           dynamic temp = bar;
           return temp.Value;
       } 
       catch ()
       {
           throw new Exception( "Generic Fail Message" );
       }
    }
string FooMyXObject( XObject bar ){
    if (bar.NodeType == NodeType.Element || bar.NodeType == NodeType.XAttribute)
        return ((dynamic)bar).Value;
    else
        throw new Exception( "Generic Fail Message" );
}