C# XAttribute默认值(如果XElement上不存在)

C# XAttribute默认值(如果XElement上不存在),c#,.net,linq,xelement,xattribute,C#,.net,Linq,Xelement,Xattribute,如果XElement上不存在XAttribute,是否有更简单/更好的方法返回默认值 我试着用一种更短的方式写这篇文章(因为它是两行): 我的方法:通过扩展方法: public static XAttribute Attribute(this XElement obj, string name, string defaultValue) { if (obj.Attribute(name) == null) return new XAttribute(name, defau

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

我试着用一种更短的方式写这篇文章(因为它是两行):

我的方法:通过扩展方法:

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;
这会不会有任何副作用,比如巨大的负面速度影响?
有更好的方法吗?

有一种更简单的方法:

var v = (string) root.Attribute("testAttribute") ?? "";
如果输入
XAttribute
为空,则返回
null
。空合并运算符然后有效地提供空字符串的默认值


当然,您仍然可以编写扩展方法,但我会根据上面的内容来编写。我还将
name
参数更改为
XName
类型,而不是
string
,以获得更大的灵活性。

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

[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);

希望这有帮助。
System.Xml.Linq
名称空间广泛使用了不明显的隐式转换,因为intellisense不会显示它们。值得注意的是,使用C#6,您还可以执行
var v=root.Attribute(“testAttribute”)?.Value??"";@Khale_Kitha:你可以,但我想我还是会做演员。除此之外,当强制转换到其他可为null的类型时,这种方法也可以工作。
var attribute = propertyInfo.GetCustomAttribute(typeof(DefaultValue),false);
var value = attribute.GetValue(element);