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;

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

4

2 回答 2

26

有一种更简单的方法可以做到这一点:

var v = (string) root.Attribute("testAttribute") ?? "";

如果输入为空,则从to显式转换XAttributestring返回。然后,null-coalescing 运算符有效地提供空字符串的默认值。nullXAttribute

当然,你仍然可以编写你的扩展方法,但我会按照上面的来做。我还将name参数更改为 typeXName而不是string,以获得更大的灵活性。

于 2012-12-06T16:05:31.753 回答
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);

希望这可以帮助

于 2012-12-07T11:52:38.690 回答