zoukankan      html  css  js  c++  java
  • c#枚举值增加特性说明

    c#枚举值增加特性说明

    通过特性给一个枚举类型每个值增加一个字符串说明,用于打印或显示。

    自定义打印特性

    [AttributeUsage(AttributeTargets.Field)]
    public class EnumDisplayAttribute : Attribute
    {
        public EnumDisplayAttribute(string displayStr)
        {
            Display = displayStr;
        }
        public string Display
        {
            get;
            private set;
        }
    }
    

    打印特性定义很简单,只含有一个字符串属性。

    定义一个枚举

    public enum TestEnum
    {
        [EnumDisplay("一")]
        one,
    
        [EnumDisplay("二")]
        two,
    
        three
    }
    

    枚举类型one,two均增加了一个打印特性。

    增加枚举扩展方法取得打印特性值

    public static class EnumExtentions
    {
        public static string Display(this Enum t)
        {
            var t_type = t.GetType();
            var fieldName = Enum.GetName(t_type, t);
            var attributes = t_type.GetField(fieldName).GetCustomAttributes(false);
            var enumDisplayAttribute = attributes.FirstOrDefault(p => p.GetType().Equals(typeof(EnumDisplayAttribute))) as EnumDisplayAttribute;
            return enumDisplayAttribute == null ? fieldName : enumDisplayAttribute.Display;
        }
    }
    
    1. 获取枚举值对应的枚举filed字符串 var fieldName = Enum.GetName(t_type, t);
    2. 获取filed对应的所有自定义特性集合 var attributes = typeof(TestEnum).GetField(fieldName).GetCustomAttributes(false);
    3. 获取EnumDisplayAttribute特性 var enumDisplayAttribute = attributes.FirstOrDefault(p => p.GetType().Equals(typeof(EnumDisplayAttribute))) as EnumDisplayAttribute;
    4. 如存在EnumDisplayAttribute特性返回其Display值,否则返回filed字符串 return enumDisplayAttribute == null ? fieldName : enumDisplayAttribute.Display;

    使用示例

    class Program
    {
        static void Main(string[] args)
        {
            TestEnum e = TestEnum.one;
            Console.WriteLine(e.Display());
            TestEnum e1 = TestEnum.three;
            Console.WriteLine(e1.Display());
            Console.ReadKey();
        }
    }
    

    输出:

    一  
    three
    

    扩展说明

    此方法不仅可以给枚举类型增加说明特性,亦可给自定义类型的属性,方法增加自定义特性。。
    在使用反射使GetField(string name) GetMethod(string name) GetProperty(string name)等均需要字符串
    在获取自定义类型属性或方法名称字符串时可以使用 nameof

    public class T
    {
        public void Get()
        { }
        public int Num { get; set; }
    }
    T tt = new T();
    Console.WriteLine(nameof(tt.Num));
    Console.WriteLine(nameof(tt.Get));
    享受生活+创造
  • 相关阅读:
    Task示例,多线程
    request
    do put in ruby
    Ruby零星笔记
    Git的常用操作
    如何在Rails中执行Get/Post/Put请求
    Lua中的基本函数库
    Step By Step(Lua目录)
    position:fixed失效原因
    前端性能监控-window.performance.timing篇
  • 原文地址:https://www.cnblogs.com/theLife/p/6843483.html
Copyright © 2011-2022 走看看