由于项目中需要使用到序列化相关的技术,从而想到是否可以使用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本身不具有实际作用,主要是用来描述元素。但在实际使用中可以通过反射来获取元素描述,通过对描述的分析,来进行相关的处理

C# Attribute学习的更多相关文章

  1. .Net里的Attribute 学习

    .Net里的Attribute 学习 前两天看到书里边讲Attribute定制,结合了网上的资料,自己做了简单的登录功能,并结合了某些设计模式,有兴趣的朋友可以看下.由于时间原因,没有做过多的说明,直 ...

  2. 代码走查25条疑问 C# 跳转新的标签页 C#线程处理 .Net 特性 attribute 学习 ----自定义特性 看懂 ,学会 .NET 事件的正确姿势-简单版

    代码走查25条疑问   代码走查(Code Review) 是一个开发人员与架构师集中讨论代码的过程.通过代码走查可以提高代码的 质量,同时减少Bug出现的几率.但是在小公司中并没有代码走查的过程在这 ...

  3. .Net 特性 attribute 学习 ----自定义特性

    什么是特性? [Obsolete("不要用无参构造函数",true)] 放在方式上, 该方法就不能使用了  [Serializable]放在类上面.该类就是可以序列化和反序列化使用 ...

  4. C#特性Attribute学习

    起初一直纠结于如何调用特性附着在下面那个成员的值,后来发现不需要调用,通过反射加载的时候是自动绑定上去的,即 获得成员对象之后,有一个方法可以获得特性标签. 其实从类库提供者,和类库使用者的角度,分开 ...

  5. C#学习笔记 -- Attribute

    学习参考: http://www.cnblogs.com/dudu/articles/4449.html http://www.cnblogs.com/anytao/archive/2007/04/1 ...

  6. 学习笔记--C#特性Attribute(一)

    这个框框好烦人啊,删不掉 一.背景 [serializable] public class Person(){} 这是我第一次看到特性(Attribute),那时我还不知道这是什么,怎么会有这种写法, ...

  7. 学习笔记: 特性Attribute详解,应用封装

    /// /// 特性:中括号声明 /// /// 错觉:每一个特性都可以带来对应的功能 /// /// 实际上特性添加后,编译会在元素内部产生IL,但是我们是没办法直接使用的, /// 而且在meta ...

  8. OpenCV 学习笔记 05 人脸检测和识别 AttributeError: module 'cv2' has no attribute 'face'

    1 环境设置: win10 python 3.6.8 opencv 4.0.1 2 尝试的方法 在学习人脸识别中,遇到了没有 cv2 中没有 face 属性.在网上找了几个方法,均没有成功解决掉该问题 ...

  9. [转]学习C#:Attribute与Property

    一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAttribute [AttributeUsage(AttributeTargets.Class)] ...

随机推荐

  1. UIScrollView的delaysContentTouches与canCencelContentTouches属性

    UIScrollView有一个BOOL类型的tracking属性,用来返回用户是否已经触及内容并打算开始滚动,我们从这个属性开始探究UIScrollView的工作原理: 当手指触摸到UIScrollV ...

  2. knockoutjs+ jquery pagination+asp.net web Api 实现无刷新列表页

    Knockoutjs 是一个微软前雇员开发的前端MVVM JS框架, 具体信息参考官网 http://knockoutjs.com/ Web API数据准备: 偷个懒数据结构和数据copy自官网实例  ...

  3. [Java 进阶]Java中的国际化

    背景知识 现代软件开发,往往做出的应用程序不止给一个国家的人去使用.不同国家的人往往存在语言文字不通的问题.由此产生了国际化(internationalization).多语言(multi-langu ...

  4. Apworks框架实战(一):Apworks到底是什么?

    简介 Apworks是一款基于Microsoft .NET的面向领域驱动的企业级应用程序开发框架,它适用于以领域模型为核心的企业级系统的开发和集成.Apworks不仅能够很好地支持经典的分层架构,而且 ...

  5. HighchartsNET快速图表控件-开源

    前言: HighchartsNET快速图表控件,基于Highcharts的asp.net web控件.只需几行代码你就能快速生成一个图表. 从此不再担心图表复杂.简单几行代码就可以搞定,节省大量工作时 ...

  6. 【Win10开发】如何在页面之间传值

    我们知道UWP是通过不同的页面来展示不同的内容的,那么我们该怎么进行页面之间的传值呢? 首先我们在MainPage里面写一个ListView来展示一些英文单词. List<English> ...

  7. 【C#公共帮助类】枚举独特类

    这个是枚举类,可能大家根据个人需求不同,不是很需要,但是跟着做那个项目的朋友会用到 我在这贴一下代码 using System; using System.Collections.Generic; u ...

  8. datagridview 单元格格式转换注意

    datagridview 单元格内容进行比较时要注意正确写法要用强制转换,否则出错Convert.ToString(grd_order.SelectedRows[0].Cells[1].Value)= ...

  9. disabled="true" 的标签元素不可提交

    把jsp页面的input 标签设置成不可编辑: <input  name="Id"    value="${order.Id}" readOnly=&qu ...

  10. 【工匠大道】Git的使用总结

    初衷是想将一些常用的代码整理在博客园上,但是考虑到博客园上的代码量多,需要折叠,折叠后就不能直接修改,于是想到了 大家都常用的 gitHub来进行代码的管理. 其实之前我是用过 Osa的git的,但是 ...