c# .net linq xelement xattribute

c# - Valor predeterminado de XAttribute si no existe en XElement



.net linq (2)

¿Existe una forma más fácil / mejor de devolver un valor predeterminado si no existe un XAttribute en un XElement ?:

Estoy tratando de escribir esto de una manera más corta (porque es de dos líneas):

var a = root.Attribute("testAttribute"); var v = (a == null ? "" : a.Value);

Mi enfoque: a través de un método de extensión:

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;

¿Tendrá esto efectos secundarios como un impacto masivo de velocidad negativa? ¿Hay alguna manera mejor de hacerlo?


Hay una manera mucho más fácil de hacer eso:

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

La conversión explícita de XAttribute a string devuelve null si la entrada XAttribute es nula. El operador de unión nula proporciona efectivamente el valor predeterminado de una cadena vacía.

Por supuesto, todavía puedes escribir tu método de extensión, pero lo haría en términos de lo anterior. También cambiaría el parámetro de name para que sea de tipo XName lugar de string , para una mayor flexibilidad.


Necesitaba algo similar en mi proyecto. He creado un atributo personalizado

[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 } }

Utilicé este atributo sobre todas las propiedades con uso similar

[DefaultValue(ElementName="elementName",AttributeName="attri",DefaultValue="Name")] public string Prop{get; set;}

Obtengo el valor invocando un método de este atributo.

var attribute = propertyInfo.GetCustomAttribute(typeof(DefaultValue),false); var value = attribute.GetValue(element);

Espero que esto ayude