• C# Attribute学习


      由于项目中需要使用到序列化相关的技术,从而想到是否可以使用C#中的特性,特此花了近两小时学习了一下。

      对于特性的学习,主要参考了两篇博文,特此感谢。以下附链接:

      http://www.cnblogs.com/luckdv/articles/1682488.html

      http://www.cnblogs.com/liuxinxin/articles/2265672.html

      在学习的过程中,一直以为特性对于元素可以起到什么实质性的影响,例如系统内置的特性,Obsolete可以阻止用户使用所引用该特性的元素。

      由于以上两篇文章对于特性的描述比较详细,在此就不写太多废话,直接上实例(模仿Json解析,并使用Attribute将一个属性的值引用到另一个属性),也行效果会更好。例子比较简单,主要起引导作用。

      

    using System;
    using System.Reflection;
     
    namespace Attribute
    {
        class Program
        {
            static void Main( string[] args)
            {
                string s = "{A:1,B:2}";
                AtoC ab = Deserializer< AtoC>(s);
     
                Console.WriteLine( "A=" + ab.A);
                Console.WriteLine( "B=" + ab.B);
                Console.WriteLine( "C=" + ab.C);
            }
     
            private static T Deserializer<T>( string s) where T: new ()
            {
                Type t = typeof(T);
                T ins = new T();
                //解析所有的属性
                string[] sour = s.TrimStart('{').TrimEnd('}' ).Split(',' );
                foreach ( string sou in sour)
                {
                    string key = sou.Split( ':')[0];
                    string value = sou.Split( ':')[1];
                    //获取属性值
                    PropertyInfo props = t.GetProperty(key);
                    props.SetValue(ins, value, null);
     
                    //获取所有的特性
                    object[] att = props.GetCustomAttributes(typeof(HelpAttribute ), false );
                    //将获到的特性所指向的对象赋值
                    foreach ( HelpAttribute a in att)
                    {
                        t.GetProperty(a.Param).SetValue(ins, value, null);
                    }
                }
                return ins;
            }
        }
     
        [AttributeUsage( AttributeTargets.Property, AllowMultiple = false, Inherited = true )]
        class HelpAttribute : Attribute
        {
            public HelpAttribute( string param)
            {
                this.param = param;
            }
            //只读属性
            private string param;
            public string Param { get { return param; } }
        }
     
        public class AtoC
        {
            [ Help( "C")]
            public string A { get; set; }
            public string B { get; set; }
            public string C { get; set; }
        }
    }
      
    总结:Attribute本身不具有实际作用,主要是用来描述元素。但在实际使用中可以通过反射来获取元素描述,通过对描述的分析,来进行相关的处理
  • 相关阅读:
    hdu1316
    MVC中的ViewData、ViewBag和TempData
    linux下性能监控工具
    【翻译自mos文章】执行utlpwdmg.sql之后报ORA-28003, ORA-20001, ORA-20002, ORA-20003, ORA-20004 错误
    HTTP协议的消息头:Content-Type和Accept的作用 转载https://www.cnblogs.com/lexiaofei/p/7289436.html
    HTTP协议的消息头:Content-Type和Accept的作用
    JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html
    Http协议中get和post的区别
    常用的HTTP请求头与响应头
    浏览器获取自定义响应头response-headers
  • 原文地址:https://www.cnblogs.com/kai364/p/4417436.html
Copyright © 2020-2023  润新知