Значение по умолчанию 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;
Будет ли это иметь какие-либо побочные эффекты, как массовое негативное влияние скорости?
Есть ли лучший способ сделать это?
Ответы
Ответ 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);
Надеюсь, что это поможет