c# - studio - System.ComponentModel.DescriptionAttribute en la biblioteca de clases portátil
9. ¿en c# que es un comentario? (3)
Estoy usando el atributo Descripción en mis enumeraciones para proporcionar un nombre fácil de usar para un campo de enumeración p.ej
public enum InstallationType
{
[Description("Forward of Bulk Head")]
FORWARD = 0,
[Description("Rear of Bulk Head")]
REAR = 1,
[Description("Roof Mounted")]
ROOF = 2,
}
Y acceder a esto es fácil con un buen método de ayuda:
public static string GetDescriptionFromEnumValue(Enum value)
{
DescriptionAttribute attribute = value.GetType()
.GetField(value.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.SingleOrDefault() as DescriptionAttribute;
return attribute == null ? value.ToString() : attribute.Description;
}
Necesito convertir esto en una biblioteca de clases portátil pero no parece tener acceso a la biblioteca System.ComponentModel. cuando intento agregar una reverencia, VS me dice que ya he hecho referencia a todo.
Gracias
Dado que DescriptionAttribute
no está disponible para las bibliotecas de clases portátiles, debe utilizar otro atributo. El espacio de nombres System.ComponentModel.DataAnnotations
que está disponible para las bibliotecas de clases portátiles proporciona el atributo DisplayAttribute que puede usar en su lugar.
public enum InstallationType
{
[Display(Description="Forward of Bulk Head")]
FORWARD = 0,
[Display(Description="Rear of Bulk Head")]
REAR = 1,
[Display(Description="Roof Mounted")]
ROOF = 2,
}
Tu método necesita ser cambiado a
public static string GetDescriptionFromEnumValue(Enum value)
{
DisplayAttribute attribute = value.GetType()
.GetField(value.ToString())
.GetCustomAttributes(typeof(DisplayAttribute ), false)
.SingleOrDefault() as DisplayAttribute ;
return attribute == null ? value.ToString() : attribute.Description;
}
Intente esto para recuperar el atributo para la enumeración en las bibliotecas portátiles:
public static class EnumsHelper
{
public static T GetAttributeOfType<T>(this Enum enumVal) where T : Attribute
{
var typeInfo = enumVal.GetType().GetTypeInfo();
var v = typeInfo.DeclaredMembers.First(x => x.Name == enumVal.ToString());
return v.GetCustomAttribute<T>();
}
}
Actualización : también debe declarar un nuevo atributo (ver como DescripciónAtributo no disponible en PCL), por ejemplo a continuación:
public class MyDescriptionAttribute : Attribute
{
public virtual string Text { get; set; }
}
y agrega un método más en la clase EnumsHelper:
public static class EnumsHelper
{
...
public static string GetDescription(this Enum enumVal)
{
var attr = GetAttributeOfType<MyDescriptionAttribute>(enumVal);
return attr != null ? attr.Text : string.Empty;
}
}
y si tiene la siguiente enumeración:
public enum InstallationType
{
[MyDescription(Text = "Forward of Bulk Head")]
FORWARD = 0
}
Puedes recuperar la descripción con un código como este:
static void Main(string[] args)
{
var it = InstallationType.FORWARD;
var description = it.GetDescription();
Console.WriteLine(description);
}
Si algo está disponible para una biblioteca de clases portátil depende un poco de los marcos que seleccionó para la biblioteca: solo obtiene la intersección estricta. Sin embargo, bien podría ser que este atributo simplemente no exista en uno de sus marcos específicos. En cuyo caso, una opción es agregar la suya , entonces usted sabe que está disponible. Por ejemplo:
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class EnumDescriptionAttribute :Attribute
{
private readonly string description;
public string Description { get { return description; } }
public EnumDescriptionAttribute(string description)
{
this.description = description;
}
}
enum Foo
{
[EnumDescription("abc")]
A,
[EnumDescription("def")]
B
}
Tenga en cuenta que intencionalmente no he incluido los constructores de serialización adicionales aquí, porque también dependen de las características que no están disponibles en todos los marcos. Cambiar su código de usar [Description]
/ DescriptionAttribute
a [EnumDescription]
/ EnumDescriptionAttribute
debería ser bastante trivial.