Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

System.ComponentModel.DescriptionAttribute in portable class library

Tags:

I am using the Description attribute in my enums to provide a user friendly name to an enum field. e.g.

public enum InstallationType {     [Description("Forward of Bulk Head")]     FORWARD = 0,      [Description("Rear of Bulk Head")]     REAR = 1,      [Description("Roof Mounted")]     ROOF = 2, } 

And accessing this is easy with a nice helper method:

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

I need to convert this into a portable class library but it doesn't seem to have access to the System.ComponentModel library. when I try add a reverence VS tells me that I have referenced everything already.

Thanks

like image 274
Crudler Avatar asked Sep 20 '13 09:09

Crudler


2 Answers

Since DescriptionAttribute is not available for portable class libraries you need to use another attribute. The namespace System.ComponentModel.DataAnnotations which is available for portable class libraries provides the attribute DisplayAttribute that you can use instead.

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

Your method needs to be changed to

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;     } 
like image 153
Jehof Avatar answered Oct 22 '22 20:10

Jehof


Whether something is available to a portable class library depends a bit on exactly which frameworks you selected for the library - you get the strict intersection only. However, it could well be that this attribute simply doesn't exist in one of your targeted frameworks. In which case, one option is add your own - then you know it is available. For example:

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

Note that I intentionally haven't included the additional serialization construtors here, because those too depend on features that are not available on all frameworks. Changing your code from using [Description] / DescriptionAttribute to [EnumDescription] / EnumDescriptionAttribute should be fairly trivial.

like image 31
Marc Gravell Avatar answered Oct 22 '22 20:10

Marc Gravell