如果在XElement上不存在XAttribute默认值,该怎么办?

17

如果 XElement 上的 XAttribute 不存在,有没有更简单/更好的方法返回默认值?

我试图用更短的方式来编写这个代码(因为它本来是两行):

var a = root.Attribute("testAttribute");
var v = (a == null ? "" : a.Value);

我的做法:通过扩展方法实现:

public static XAttribute Attribute(this XElement obj, string name, string defaultValue)
{
    if (obj.Attribute(name) == null)
        return new XAttribute(name, defaultValue);
    return obj.Attribute(name);
}

var v = root.Attribute("testAttribute", "").Value;

这会有任何副作用,如负面的速度影响吗? 有没有更好的方法来做到这一点?

2个回答

26

有更简单的方法:

var v = (string) root.Attribute("testAttribute") ?? "";
XAttribute 显式转换为 string,如果输入的 XAttribute 为空,则返回 null。然后,null 合并运算符 effectively 提供了一个空字符串的默认值。

当然,你仍然可以编写自己的扩展方法,但我建议基于上述进行编写。我还会将参数 name 更改为 XName 类型,以获得更大的灵活性。

+1. System.Xml.Linq 命名空间广泛使用隐式转换,这一点并不明显,因为智能感知无法揭示它们。 - Olivier Jacot-Descombes
值得注意的是,使用C#6,您还可以执行var v = root.Attribute("testAttribute")?.Value ?? ""; - Khale_Kitha
@Khale_Kitha:你可以这样做,但我认为我仍然会进行强制转换。除此之外,当转换为其他可空类型时,这种方法也是有效的。 - Jon Skeet

0

我在我的项目中需要类似的东西。我创建了一个自定义属性

[AttributeUsage(AttributeTargets.Property)]
public class DefaultValue : Attribute
{
 public string ElementName {get; set;}
 public string AttributeName {get; set;}
 public object DefaultValue {get; set;}

public object GetValue(XElement element)
{
  var v = root.Attribute(AttributeName);
 if(v!= null)
  return v.value;
 else
  return DefaultValue
}
}

我在所有具有类似用途的属性上使用了这个属性。

[DefaultValue(ElementName="elementName",AttributeName="attri",DefaultValue="Name")]
public string Prop{get; set;}

我通过调用该属性的方法来获取值

var attribute = propertyInfo.GetCustomAttribute(typeof(DefaultValue),false);
var value = attribute.GetValue(element);

希望这能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接