zoukankan      html  css  js  c++  java
  • .net c#获取自定义Attribute

    前言: 在c#开发中,有时候我们需要读取 Attribute中的信息(关于Attribute , 我自己把他理解成一个可以为类,属性标记的东西,这个标记可以为你提供一些关于类,方法,属性的额外信息)

    我们如何获取这些标记的信息,如何获取自定义Attribute信息。

    正文:

    1.获取一个枚举的详细信息

    假设我们有这样一个枚举

    public enum Category
        {
            /// <summary>
            /// 英语
            /// </summary>
            English,
            /// <summary>
            /// 汉语
            /// </summary>
            Chinese,
            /// <summary>
            /// 日语
            /// </summary>
            Japanese
        }
    现在我要获取每个枚举的描述信息。 如果你不了Attribute,或许你只能这样获取
    static class Program
        {
            static void Main()
            {
                var category = Category.Chinese;
                switch (category)
                {
                    case Category.Chinese: Console.WriteLine("中文"); break;
                    case Category.English: Console.WriteLine("英文"); break;
                    case Category.Japanese: Console.WriteLine("日语"); break;
                }
            }
        }

    似乎几个Case语句也能完成任务。 但是如果枚举项个数超多,那这种写法无疑很丑陋。

    ----------------------------------华丽分割线------------------------------------

    接下来探讨 Attribute的一种简单应用场景

    修改枚举

    public enum Category
        {
            /// <summary>
            /// 英语
            /// </summary>
            [Description("西洋文")]
            English,
            /// <summary>
            /// 汉语
            /// </summary>
            [Description("汉语")]
            Chinese,
            /// <summary>
            /// 日语
            /// </summary>
            [Description("日本话")]
            Japanese
        }

    每个枚举项加入System.ComponentModel命名空间的 DescriptionAttribute,不清楚可以msdn一下。

    然后附上两个算我原创的类吧...记得层在公司使用过直接获取 Descripton标记的方法,但是没有源码,我花了一天时间来查询这个问题,终于写出了自己的帮助类.奉献给大家..

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;
     
    namespace ZyTools
    {
        /// <summary>
        /// 枚举帮助类
        /// </summary>
        public class EnumHelper
        {
            /// <summary>
            /// 获取枚举项的Attribute
            /// </summary>
            /// <typeparam name="T">自定义的Attribute</typeparam>
            /// <param name="source">枚举</param>
            /// <returns>返回枚举,否则返回null</returns>
            public static T GetCustomAttribute<T>(Enum source) where T : Attribute
            {
                Type sourceType = source.GetType();
                string sourceName = Enum.GetName(sourceType, source);
                FieldInfo field = sourceType.GetField(sourceName);
                object[] attributes = field.GetCustomAttributes(typeof(T), false);
                foreach (object attribute in attributes)
                {
                    if (attribute is T)
                        return (T)attribute;
                }
                return null;
            }
     
            /// <summary>
            ///获取DescriptionAttribute描述
            /// </summary>
            /// <param name="source">枚举</param>
            /// <returns>有description标记,返回标记描述,否则返回null</returns>
            public static string GetDescription(Enum source)
            {
                var attr = GetCustomAttribute<System.ComponentModel.DescriptionAttribute>(source);
                if (attr == null)
                    return null;
     
                return attr.Description;
            }
        }
    }
     


    现在我们只需要,这样写代码了.

    var category = Category.Chinese;
    
     Console.WriteLine(EnumHelper.GetDescription(category));


    是不是很清爽 .希望本文对初学者有所帮助,来源于www.xiaoniusoft.com ,转摘请注明。爱编程爱生活!!

    明确个目标,一直走下去
  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/fhlj/p/3613561.html
Copyright © 2011-2022 走看看