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,所以为空。

相关文章
uniapp引入阿里图标库
平时项目开发肯定少不了图标的使用,除了自己定制图标库之外,再一个比较不错的就是使用阿里的图标库,这里包含了很多分类的图标,基本上你想用的图标它都有,不仅好看,使用起来也是非常方便的,下面一起来看看吧。
961 0
uniapp引入阿里图标库
|
机器学习/深度学习 数据采集 存储
使用Python实现深度学习模型:智能医疗影像分析
使用Python实现深度学习模型:智能医疗影像分析
444 0
|
9月前
|
数据可视化 项目管理
解读:项目管理中的6大变革模型是什么?怎么用?
本文介绍了6种项目变革管理模型,包括莱温的三步变革模型和科特的八步变革模型。莱温模型适用于重大组织变革和引入新系统或技术,科特模型适用于需要长期适应变革的场合。
218 0
解读:项目管理中的6大变革模型是什么?怎么用?
|
存储 缓存 安全
深入理解Linux虚拟内存管理(一)2
深入理解Linux虚拟内存管理(一)
243 2
SSLError(MaxRetryError(‘HTTPSConnectionPool(host=\‘repo.anaconda.com\‘, port
SSLError(MaxRetryError(‘HTTPSConnectionPool(host=\‘repo.anaconda.com\‘, port
1316 0
|
设计模式 负载均衡 中间件
深入理解PHP中的中间件模式
【7月更文挑战第12天】中间件模式在PHP开发中扮演着至关重要的角色,它允许开发者在请求处理流程中注入自定义的逻辑。本文将深入探讨中间件的工作原理、常见应用场景以及如何实现自己的中间件。通过实例演示,我们将揭示中间件模式如何优化应用架构,增强代码的可维护性和可扩展性。
197 0
|
机器学习/深度学习 数据采集 自然语言处理
用户意图预测
用户意图预测
451 0
|
vr&ar SoC 内存技术
深入理解AMBA总线(十二)AXI突发传输和AXI控制信号
深入理解AMBA总线(十二)AXI突发传输和AXI控制信号
3399 0
|
存储 SQL 缓存
顶会论文解读|DEPART:分布式KV存储系统的副本解耦方案
基于LSM-tree的键值存储系统是NewSQL/NoSQL产品中最常用的底层存储方案,对其进行研究具有重要意义与应用价值。论文针对 分布式键值系统首次提出了副本解耦的思想,在多副本容错机制下能够实现副本数据的高效管理,从而显著提升系统性能。并且论文提出的技术可以应用到Cassandra、TiKV、ScyllaDB等系统中。本次分享将和大家一起讨论基于副本解耦的分布式键值系统的设计实现方案,并探讨未来的推广应用。
顶会论文解读|DEPART:分布式KV存储系统的副本解耦方案
|
机器学习/深度学习 Python
图(Graph)--经典图特征工程:节点分析
本文分享了关于学习参考多变博客文献后总结的 经典图特征工程 分析方法,以供参考学习
982 0