Attribute特性的原理

简介: Attribute特性的原理

当我们在Visual Studio添加一个自定义控件时,它都会给我们以下默认的代码。

[DefaultProperty("Text")]
    [ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
    public class WebCustomControl1 : WebControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }
            set
            {
                ViewState["Text"] = value;
            }
        }
        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }

在这个控件中有个默认的属性"Text",在这个属性有[DefaultValue("")]相应的特性,来给该属性设置默认值。以前一直


想不明白微软是怎么实现的,直到昨天看了《你必须知道的.Net》中讲“特性”这一章受到了启发。于是我马上去试试,


还真的可以。废话少说,来看看我的实现方法。



首先我们先创建一个自己默认值特性SelfDefaultValueAttribute:

[AttributeUsageAttribute(AttributeTargets.All,   //     可以对任何应用程序元素应用属性    
        AllowMultiple = true,                        //     允许指定多个实例   
        Inherited = false)]                          //     不继承到派生类
    public  class SelfDefaultValueAttribute : System.Attribute
    {
        public SelfDefaultValueAttribute(object defaultVale)
        {
            this.AttrValue = defaultVale;
        }
        public object AttrValue
        {
            get;
            set;
        }
    }

接着我们创建一个自己的控件父类SelfControl:


public  class SelfControl
    {
       public SelfControl()
        {
            Type tp = this.GetType();
            PropertyInfo[] propInfoList = tp.GetProperties();   //获得所有的属性
            foreach (PropertyInfo p in propInfoList)
            {
                //获得当前属性的特性
                SelfDefaultValueAttribute m = Attribute.GetCustomAttribute(p, typeof
(SelfDefaultValueAttribute)) as SelfDefaultValueAttribute;
                //判断该属性是否有特性
                if (m != null)
                {
                    //设置默认值
                    p.SetValue(this, m.AttrValue, null);
                }
                else
                {
                    //设置值为空
                    p.SetValue(this, null, null);
                }
            }
        }
       [SelfDefaultValue("")]
       public virtual string Name
       {
           get;
           set;
       }
    }

这个控件只有一个属性"Name"默认值为空。说明一下的是,在这里我们用到了反射的机制,所以我们要引入空间:


System.Reflection。


现在,我们就可以创建属于自己定义的控件了。

好了,终于完成了。那我们现在来测试一下。

public class Myrun
   {
       public static void Main(string[] args)
       {
           TestSelfControl selfCon = new TestSelfControl();
           Console.WriteLine("控件宽度:{0}",selfCon.Width);
           Console.WriteLine("控件高度:{0}", selfCon.Height);
           Console.WriteLine("控件名字:{0}", selfCon.Name);
           Console.WriteLine("控件标签:{0}", selfCon.HtmlTag);
           Console.WriteLine("控件文本:{0}", selfCon.Text);
           Console.ReadLine();
       }
   }
控件宽度:100
控件高度:0
控件名字:
控件标签:
控件文本:TestControl

由于我们没给控件的高度设置默认值、高度类型Int,所以高度默认为0;而名字和标签类型为String,所以为空。

相关文章
|
3月前
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
c#之Attribute特性的原理
c#之Attribute特性的原理
57 0
|
Java 编译器 程序员
谈谈C++新标准带来的属性(Attribute)
从C++11开始,标准引入了一个新概念“属性(attribute)”,本文将简单介绍一下目前在C++标准中已经添加的各个属性以及常用属性的具体应用。
谈谈C++新标准带来的属性(Attribute)
|
XML Java 数据格式
Attribute(特性),怎么用才更好?
前几年:   2008年的某一天,我坐火车去北京。硬卧上铺,一晚上就到北京了。爬到上铺之后发现,旁边上铺有一老兄抱着一个笔记本,一开始还以为是看电影呢,仔细一看才发现——老天呀,居然在写代码!     这老兄也太工作狂了,当时可是晚上九点多了呀。
1022 0
|
C# 编译器 数据格式
|
C# 编译器 数据格式