Значение по умолчанию XAttribute, если оно не существует на XElement - программирование
Подтвердить что ты не робот

Значение по умолчанию 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;

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

4b9b3361

Ответ 1

Там намного проще сделать это:

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

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

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

Ответ 2

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

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

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