06-自定义Attribute标记案例

自定义Attribute:

1)Attribute都从System. Attribute类继承,类名一般以Attribute结尾

2) 标记类的用途—AttributeUsage标记(标记的标记):AttributeTargets:可以添加到哪些成员上。 AllowMultiple:是否允许在一个成员上标记这个Attribute的多个实例,默认false。标注在Attribute类的类名上方。

3)Attribute只是给类、成员做标记,本身没有什么意义,不会发生任何动作,就像小偷踩点在门上做标记(StealableAttribute)一样,具体这个标记会起到什么作用是由使用这个类、成员的代码决定的。

案例代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;

namespace _11动态创建一个对象的html表单页
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Person p1 = new Person();
            p1.Name = "hzy";
            p1.Age = 25;
            p1.Email = "hzy@sina.com";
            // Car car = new Car() { Brand = "兰博基尼", LicenseNo = "京00000" };
            CreateFormByObject(p1);
        }

        private void CreateFormByObject(object obj)
        {
            Type type = obj.GetType();//获取这个对象的type
            StringBuilder sbHtml = new StringBuilder();
            PropertyInfo[] pinfo = type.GetProperties();//获取当前对象中的所有的属性
            foreach (PropertyInfo item in pinfo)
            {
                //这句话的意思是,获取当前遍历的属性Brand上所标记的UserLanguageAttribute特性
                object[] objs = item.GetCustomAttributes(typeof(UserLanguageAttribute), false);

                //获取所有标记的特性,不包含父类中继承下来的特性
                //item.GetCustomAttributes(false)
                //objs[0].GetType().Name
                //表示当前属性标记了这个特性(UserLanguageAttribute)
                if (objs.Length > 0)
                {
                    UserLanguageAttribute ula = (UserLanguageAttribute)objs[0];
                    sbHtml.Append(ula.DisplayLanguage + ":<input value=\"" + item.GetValue(obj, null) + "\"/><br/>");
                }
                else
                {
                    sbHtml.Append(item.Name + ":<input value=\"" + item.GetValue(obj, null) + "\"/><br/>");
                }
            }
            webBrowser1.DocumentText = sbHtml.ToString();
        }
    }

    public class Person
    {
        [UserLanguage("xing ming")]
        public string Name
        {
            get;
            set;
        }
        [UserLanguage("nian ling")]
        public int Age
        {
            get;
            set;

        }
        //[UserLanguage("yi mei er")]
        public string Email
        {
            get;
            set;
        }
    }

    public class Car
    {
        [UserLanguage("品牌")]
        public string Brand
        {
            get;
            set;
        }
        [UserLanguage("车牌号码")]
        public string LicenseNo
        {
            get;
            set;
        }
    }

    public class UserLanguageAttribute : Attribute
    {
        public UserLanguageAttribute(string lan)
        {
            this.DisplayLanguage = lan;
        }
        public string DisplayLanguage
        {
            get;
            set;
        }
    }
}

运行结果:

posted on 2015-02-13 16:00  zy`  阅读(849)  评论(2编辑  收藏  举报

导航