TypeConverterAttribute Class
    TypeConverterAttribute 其实就是一个继承Attribute的类,使用[TypeConverter(typeof(MyClassConverter))]标签施加到程序实体 上。根据TypeConverterAttritue的定义知道这个属性Attribute可以施加到所有实体上。

    [AttributeUsageAttribute(AttributeTargets.All)] 
    public sealed class TypeConverterAttribute : Attribute

如果你对Attribute不太了解可以先看看dudu的阐释,或者看看http://www.codeproject.com/KB/cs/attributes.aspx。
Attribute是一种新的申明方式,它可以在是设计时和运行时作用于它附加的Program Entities上。
上篇我们定义了class Longitude 和 class LongitudeTypeConverter,然后我们做了个Test,实现了转换的目的。
但要在设计时或在运行时起作用,就是说在这两种情况LongitudeTypeConverter“自动的”帮助Longitude 实例于其他实例转换,需要TypeConverterAttribute的帮忙。
在coding中我们很惊奇的发现,只用在Longitude类上附加TypeConverterAttribute标签,这两者就能关联起来。为什么呢?

 [TypeConverter(typeof(LongitudeTypeConverter))]
    public class Longitude
    {}

那是因为如果一个类附件了Attribute,那么这个类就可以通过反射方法得到这个类属性,还可以通过TypeDescriptor.GetConverter静态方法获得这个类相关转换类的实例。这样就轻松的关联起来了。比如Test

class Test
    {
        public static void Main(string[] args)
        {
            //将Longitude类转换到string类型
            Longitude longitude = new Longitude(10,11,12,LongitudeDirection.East);
            LongitudeTypeConverter converter = new LongitudeTypeConverter();

            string strLongitude="";
            if (converter.CanConvertTo(typeof(string)))
            {
                //Longitude 类没有附件TypeconverterAttribute时
                strLongitude = (string)converter.ConvertTo(longitude, typeof(string));
                //Longitude 类附件了TypeconverterAttribute时
                strLongitude = (string)TypeDescriptor.GetConverter(typeof(Longitude)).ConvertTo(longitude, typeof(string));
            }
            System.Console.WriteLine(strLongitude);

            //将string还原回Longitude类
            Longitude longitude1 = new Longitude();
            if (converter.CanConvertFrom(typeof(string)))
            {
                //Longitude 类没有附件TypeconverterAttribute时
                longitude1 = (Longitude)converter.ConvertFrom(strLongitude);
                //Longitude 类附件了TypeconverterAttribute时
                longitude1 = (Longitude)TypeDescriptor.GetConverter(typeof(Longitude)).ConvertFrom(strLongitude);
            }
            System.Console.WriteLine(longitude1.Degrees);
            System.Console.WriteLine(longitude1.Direction);
            System.Console.WriteLine(longitude1.Minutes);
            System.Console.WriteLine(longitude1.Seconds);

        }
    }

上面是在运行时,如果Longitude类的方法或字段也附加了相应的ConverterAttribute,我们也可以通过反射的方法得到附加ConverterAttribute的方法或字段。
例如,

 Type type = typeof(Longitude);
            //AttributeTargs包括method实体
            CustomTypeConverterAttribute customTypeConverterAttribute;

            foreach (Attribute att in type.GetCustomAttributes(typeof(OtherTypeConverter), true))
            {
                System.Console.WriteLine("OtherTypeConverter 的属性Property" + customTypeConverterAttribute.Property1);
            }

            foreach (MethodInfo method in type.GetMethods())
            {
                foreach (Attribute att in method.GetCustomAttributes(true))
                {
                    customTypeConverterAttribute = att as CustomTypeConverterAttribute;
                    if (null != customTypeConverterAttribute)
                    {
                        System.Console.WriteLine("类的方法是:" + method.Name + " 该方法的附加Attribute是:" + customTypeConverterAttribute.ToString());
                    }
                }
            }

如果你想test上面的代码,需要自己完成CustomTypeConverterAttribute。

在 设计时的应用,例如在复杂控件中的一个属性为一个类,我们需要在property browser中以string的形式输入值来初始化或构造这个属性property,我们需要在这个属性property上附件属性 DesignerSerializationVisibility标签。
例如

 [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue(typeof(GPSLocation), "")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        [PersistenceMode(PersistenceMode.InnerProperty)]
        public GPSLocation Location
        {
            get
            {
                // if no instance created yet do so
                if (_Location == null)
                    _Location = new GPSLocation();

                return _Location;
            }
        }

上面还有PersistenceMode属性标签,其表示代码在asp.net页面显示(也可以说是持久)的方式,有几种详见http://www.cnblogs.com/thinhunan/archive/2006/12/10/588341.html

这样就可以达到效果如下([PersistenceMode(PersistenceMode.Attribute)])

<ui:LocationControl ID="LocationControl1" runat="server" 
        Location-GPSLatitude="12N1'2"" Location-GPSLongitude="24W3'4"">
</ui:LocationControl>

([PersistenceMode(PersistenceMode.InnerProperty)])

<ui:LocationControl ID="LocationControl1" runat="server">
   <Location GPSLatitude="12N1'3"" GPSLongitude="24W3'4"" />
</ui:LocationControl>

参考
http://www.codeproject.com/KB/webforms/TypeConverters.aspx
http://www.codeproject.com/KB/cs/attributes.aspx
dudu:Attribute系列 http://www.cnblogs.com/ericwen/favorite/115549.html

不对之处请批评指正。
测试代码

转载自http://blog.csdn.net/luyifeiniu/article/details/5107839

转载于:https://www.cnblogs.com/wsion/archive/2013/04/19/3030218.html

深度解析 TypeConverter TypeConverterAttribute (二)相关推荐

  1. 请用python代码表示什么_深度解析什么是二维码?用Python 5行代码生成个性二维码...

    二维码满天飞, 随便扫一扫就能扫到不一样的内容. 有没有好奇什么是二维码? 又是怎么生成的呢? 今天我们就用python 5行代码 生成一个二维码,并且是个性的二维码,想你所想的,先看效果图,准备好微 ...

  2. 舒工深度解析不规则场地座位二维码生成规则

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  3. 赵小楼《天道》《遥远的救世主》深度解析(127)一解决生存,二让心有个安处

    关注赵小楼,与10000+人一起重读天道,学习强势文化思维! 本文是按<遥远的救世主>小说情节深度解析的第127集,按小说解读完后会按<天道>电视剧不同于小说的情节解读,按情节 ...

  4. Spring源码深度解析(郝佳)-学习-源码解析-基于注解注入(二)

    在Spring源码深度解析(郝佳)-学习-源码解析-基于注解bean解析(一)博客中,己经对有注解的类进行了解析,得到了BeanDefinition,但是我们看到属性并没有封装到BeanDefinit ...

  5. 赵小楼《天道》《遥远的救世主》深度解析(94)去二不着一:自在自如逍遥境界

    本文是按<遥远的救世主>小说情节深度解析的第94集,也是"五台山论道"系列解读的第6集[本系列共20集左右,会全部以付费形式发出],按小说解读完后会按<天道> ...

  6. 多目标跟踪算法FairMOT深度解析

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨周威@知乎 来源丨https://zhuanlan.zhihu.com/p/259356109 ...

  7. 科普|深度解析5G与未来天线技术

    来源:电子万花筒 过去二十年,我们见证了移动通信从1G到4G LTE的转变.在这期间,通信的关键技术在发生变化,处理的信息量成倍增长.而天线,是实现这一跨越式提升不可或缺的组件. 按照业界的定义,天线 ...

  8. 深度解析:mPaaS 3.0全新组件

    摘要:以"数字金融新原力(The New Force of Digital Finance)"为主题,蚂蚁金服ATEC城市峰会于2019年1月4日上海如期举办.分论坛上,蚂蚁金服产 ...

  9. 推荐:微服务架构的深度解析!

    通过采用微服务架构,企业最大的收益是帮助内部IT建设沿着可演进的方向发展.支持灵活扩展.降低运维成本.快速响应业务变化. 这些底层技术能力的提升让业务更加敏捷.成本可控,企业也可以从中获得技术红利和市 ...

最新文章

  1. hdu2870暴力或者dp优化
  2. Elasticsearch DSL
  3. linux ps 代码,Linux ps命令详解(示例代码)
  4. css——常用选择器
  5. Linux下高速缓存DNS的配置
  6. prisma graphql 工具基本使用
  7. MySQL 5.7升级到8.0详细过程
  8. 建模国赛2016A-系泊系统的设计优秀论文
  9. php 下载技巧,PHP 使用技巧集
  10. 西威变频器avo下载调试资料_西门子变频器使用BOP-2 面板调试 G120
  11. Mac下Zookeeper安装及配置
  12. STM32——FLASH闪存编程原理与步骤
  13. lbp7660cdn设置网络打印_canonlbp7660cdn驱动下载-佳能lbp7660cdn打印机驱动v21.52 官方版 - 极光下载站...
  14. 计算机为什么无法搜索功能,电脑搜索功能不能用怎么办?电脑搜索不能用的解决方法...
  15. LittleVGL体验记录
  16. 【转】Sphinx速成指南
  17. 2021平凉二中高考成绩查询,平凉二中召开2020届高考启动暨教学工作推动会
  18. 使用Maxima求解常微分方程~
  19. Axure 8 设置当前动态时间
  20. 从零开始学Java编程!南通java招聘

热门文章

  1. JVM概念之Java对象的大小与引用类型
  2. 修复boot分区文件被删除的方法
  3. vs2005中关于masterpage,Theme,skin的一点总结
  4. div超出部分滚动并且隐藏滚动条
  5. Spring如何将事件分配给专门的监听器?
  6. 简单了解各种序列化技术-Hessian序列化框架
  7. MapReduce的构思和框架结构
  8. 数据库-优化-pt-kill-授权-数据
  9. Redis实现分布式锁原理SetNx命令
  10. 循环基础-程序计数从0开始