System.ComponentModel.DescriptionAttribute in portable class library

后端 未结 3 1227
灰色年华
灰色年华 2020-12-29 23:03

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(\"For         


        
相关标签:
3条回答
  • 2020-12-29 23:07

    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.

    0 讨论(0)
  • 2020-12-29 23:10

    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;
        }
    
    0 讨论(0)
  • 2020-12-29 23:33

    Try this for retrieving attribute for enum in portable libraries:

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

    Update: also you should declare new attribute (look like DescriptionAttribute not available in PCL), for example next:

    public class MyDescriptionAttribute : Attribute
    {
        public virtual string Text { get; set; }
    }
    

    and add one more method in EnumsHelper class:

    public static class EnumsHelper
    {
        ...
    
        public static string GetDescription(this Enum enumVal)
        {
            var attr = GetAttributeOfType<MyDescriptionAttribute>(enumVal);
            return attr != null ? attr.Text : string.Empty;
        }
    }
    

    and if you have next enum:

    public enum InstallationType
    {
        [MyDescription(Text = "Forward of Bulk Head")]
        FORWARD = 0
    }
    

    you can retrieve description with code like this:

    static void Main(string[] args)
    {
        var it = InstallationType.FORWARD;
        var description = it.GetDescription();
        Console.WriteLine(description);
    }
    
    0 讨论(0)
提交回复
热议问题