XAttribute
和XElement
都来自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
。
这是可能的,还是我只是被迫以如此笨重的方式做到这一点?
答案 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
命名空间中,XElement
和XAttribute
都延伸XObject
,但它们分别定义了Value
属性,因此这种分支或需要使用dynamic
类型。
在其他对象模型中,泛型可能在@meganaut建议的类似场景中可用。