【问题标题】:XAttribute default value if not existing on XElement如果 XElement 上不存在 XAttribute 默认值
【发布时间】:2012-11-24 17:14:35
【问题描述】:

如果 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;

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

【问题讨论】:

    标签: c# .net linq xelement xattribute


    【解决方案1】:

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

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

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      有一个更简单的方法来做到这一点:

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

      如果输入 XAttribute 为空,则 explicit conversion from XAttribute to string 返回 null。然后,空合并运算符有效地提供空字符串的默认值。

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

      【讨论】:

      • +1。 System.Xml.Linq 命名空间广泛使用隐式转换,这并不明显,因为智能感知不会显示它们。
      • 值得注意的是,使用 C#6 你也可以做到var v = root.Attribute("testAttribute")?.Value ?? "";
      • @Khale_Kitha:你可以,但我想我还是会做演员。除此之外,这种方法在转换为其他可为空的类型时有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多