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" );
}