Значение XAttribute по умолчанию, если оно не существует в XElement

Есть ли более простой/лучший способ вернуть значение по умолчанию, если XAttribute в XElement не существует?:

Я пытаюсь написать это короче (потому что это двухстрочный):

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;

Будет ли это иметь какие-либо побочные эффекты, такие как сильное негативное влияние на скорость? Есть ли лучший способ сделать это?


person Mike    schedule 06.12.2012    source источник


Ответы (2)


Есть гораздо более простой способ сделать это:

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

явное преобразование из XAttribute в string возвращает null, если входное значение XAttribute равно null. . Затем оператор объединения с нулевым значением эффективно предоставляет значение по умолчанию пустой строки.

Конечно, вы все еще можете написать свой метод расширения, но я бы сделал это с точки зрения вышеизложенного. Я бы также изменил параметр name на тип XName вместо string для большей гибкости.

person Jon Skeet    schedule 06.12.2012
comment
+1. Пространство имен System.Xml.Linq широко использует неявные преобразования, что неочевидно, поскольку intellisense их не раскрывает. - person Olivier Jacot-Descombes; 06.12.2012
comment
Стоит отметить, что с C#6 вы также можете сделать var v = root.Attribute("testAttribute")?.Value ?? ""; - person Khale_Kitha; 29.07.2016
comment
@Khale_Kitha: Можешь, но я думаю, что все равно буду сниматься. Помимо всего прочего, этот подход работает при приведении к другим типам, допускающим значение NULL. - person Jon Skeet; 30.07.2016

Мне нужно было подобное в моем проекте. Я создал пользовательский атрибут

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

Надеюсь это поможет

person Akanksha Gaur    schedule 07.12.2012