• [Asp.net基础]Attribute特性备忘


    Attribute 是什么

    Attribute 是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。
    简单的说,Attribute就是一种“附着物” —— 就像牡蛎吸附在船底或礁石上一样。
    这些附着物的作用是为它们的附着体追加上一些额外的信息(这些信息就保存在附着物的体内)—— 比如“这个类是我写的”或者“这个函数以前出过问题”等等。

    Attribute 的作用

    特性Attribute 的作用是添加元数据
    元数据可以被工具支持,比如:编译器用元数据来辅助编译,调试器用元数据来调试程序。

    个人理解

    注释是写给人看的. 而Attribute是写给程序看的. 在某个对象上加上注释, 在运行的时候通过反射可以拿到这个注释.
    从而进行一些操作.

    示例

    [Name("中文名","谢霆锋"),Name("英文名","Nic")]
            public class Student { }
    public class School {
    [Name("中文名", "谢霆锋"), Name("英文名", "Nic")]
                public string schoolname { get{return "牛逼大学";} }
            }
    [AttributeUsage(AttributeTargets.All,AllowMultiple=true)]
        public class Name:System.Attribute
        {
            public string Key { get; set; }
            public string Value { get; set; }
            public Name(string key, string value) {
                Key = key;
                Value = value;
            }
        }
    //获取类的特性
                var attrs= Attribute.GetCustomAttributes(typeof(Student));
                Response.Write("<br>");
                Response.Write("类的特性有");
                foreach (var item in attrs)
                {
                    var t=(Name)item;
                    Response.Write("<br>");
                    Response.Write((t).Key+" : "+t.Value+" , "+t.TypeId.ToString());
                }
    //获取属性的特性. 同样获取方法, 字段,等的特性都是这样
                var Properties = typeof(School).GetProperties();
                Response.Write("<br>"); Response.Write("<br>");
                Response.Write("属性的特性有");
                foreach (var item in Properties)
                {
                    foreach (var attr in item.GetCustomAttributes(false))
                    {
                        var t = (Name)attr;
                        Response.Write("<br>");
                        Response.Write((t).Key + " : " + t.Value + " , " + t.TypeId.ToString());
                    }
                }

    这样. 我们在运行的时候得到了Name类的实例. 输出了Name的属性

    [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
        public class LanguageAttribute : Attribute { 
            public LanguageAttribute(string languageKey, string languageValue) { 
                LanguageKey = languageKey; LanguageValue = languageValue; 
            } 
            public string LanguageKey { get; set; } 
            public string LanguageValue { get; set; } 
        }
        public static class EnumExt
        {
            /// <summary>
            /// 枚举值转换为本地语言
            /// </summary>
            /// <param name="_enum"></param>
            /// <returns></returns>
            public static string ToLocalLanguage(this Enum _enum) {
                var type = _enum.GetType();
                var cachevalue=Lib.Utils.CacheHelper.Get<string>(type.FullName+"."+_enum.ToString());
                if (cachevalue != null)
                    return cachevalue;
    
                var attr = type.GetField(_enum.ToString()).GetCustomAttributes(false); 
                string ret = ""; 
                foreach (var item in attr) { 
                    var lang = ((LanguageAttribute)item); 
                    if (System.Threading.Thread.CurrentThread.CurrentCulture.Name.ToLower() == lang.LanguageKey.ToLower()) 
                    { 
                        ret = lang.LanguageValue; break;
                    } 
                }
                Lib.Utils.CacheHelper.Insert<string>(type.FullName + "." + _enum.ToString(), ret);
                return ret; 
            }
            /// <summary>
            /// 枚举转换为字典, 进而可以转换为selectItems供dropdownlist使用
            /// </summary>
            /// <param name="_enum"></param>
            /// <returns></returns>
            public static Dictionary<string, string> ToDictionary(this Enum _enum) {
                return ToDictionary(_enum, "", "");
            }
            public static Dictionary<string, string> ToDictionary(this Enum _enum, string firstText, string firstValue)
            {
                var dic = new Dictionary<string, string>();
                if (!string.IsNullOrEmpty(firstText) && !string.IsNullOrEmpty(firstValue))
                    dic.Add(firstValue, firstText);
                Type type = _enum.GetType();
                var cachekey = type.FullName + firstText + firstValue;
                var cachevalue = Lib.Utils.CacheHelper.Get<Dictionary<string, string>>(cachekey);
                if (cachevalue != null)
                    return cachevalue;
    
                Array values= Enum.GetValues(type);
                foreach (var val in values)
                {
                    int value = (int)val;
                    var attrs= type.GetField(val.ToString()).GetCustomAttributes(false);
                    foreach (var attr in attrs)
                    {
                        var lang = ((LanguageAttribute)attr);
                        if (System.Threading.Thread.CurrentThread.CurrentCulture.Name.ToLower() == lang.LanguageKey.ToLower())
                        {
                            dic.Add(value.ToString(), lang.LanguageValue);
                            break;
                        } 
                    }
                }
                Lib.Utils.CacheHelper.Insert<Dictionary<string, string>>(cachekey, dic);
                return dic;
            }
        }
    View Code
  • 相关阅读:
    HTTP常用的动词
    mysql5.7安装与主从复制
    Linq to XML 之XElement的Descendants方法的新发现
    SQL中的内连接外连接和交叉连接是什么意思?
    LINQ TO SQL ——Group by
    分布式Web服务器架构
    基于socket的客户端和服务端聊天机器人
    linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
    关于301、302、303重定向的那些事
    手写async await的最简实现
  • 原文地址:https://www.cnblogs.com/jianjialin/p/2088326.html
Copyright © 2020-2023  润新知