深度解析 TypeConverter TypeConverterAttribute (二)
TypeConverterAttribute Class
TypeConverterAttribute 其实就是一个继承Attribute的类,使用[TypeConverter(typeof(MyClassConverter))]标签施加到程序实体 上。根据TypeConverterAttritue的定义知道这个属性Attribute可以施加到所有实体上。
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标签,这两者就能关联起来。为什么呢?
public class Longitude
{}
那是因为如果一个类附件了Attribute,那么这个类就可以通过反射方法得到这个类属性,还可以通过TypeDescriptor.GetConverter静态方法获得这个类相关转换类的实例。这样就轻松的关联起来了。比如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的方法或字段。
例如,
//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标签。
例如
[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)])
Location-GPSLatitude="12N1'2"" Location-GPSLongitude="24W3'4"">
</ui:LocationControl>
([PersistenceMode(PersistenceMode.InnerProperty)])
<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 (二)相关推荐
- 请用python代码表示什么_深度解析什么是二维码?用Python 5行代码生成个性二维码...
二维码满天飞, 随便扫一扫就能扫到不一样的内容. 有没有好奇什么是二维码? 又是怎么生成的呢? 今天我们就用python 5行代码 生成一个二维码,并且是个性的二维码,想你所想的,先看效果图,准备好微 ...
- 舒工深度解析不规则场地座位二维码生成规则
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...
- 赵小楼《天道》《遥远的救世主》深度解析(127)一解决生存,二让心有个安处
关注赵小楼,与10000+人一起重读天道,学习强势文化思维! 本文是按<遥远的救世主>小说情节深度解析的第127集,按小说解读完后会按<天道>电视剧不同于小说的情节解读,按情节 ...
- Spring源码深度解析(郝佳)-学习-源码解析-基于注解注入(二)
在Spring源码深度解析(郝佳)-学习-源码解析-基于注解bean解析(一)博客中,己经对有注解的类进行了解析,得到了BeanDefinition,但是我们看到属性并没有封装到BeanDefinit ...
- 赵小楼《天道》《遥远的救世主》深度解析(94)去二不着一:自在自如逍遥境界
本文是按<遥远的救世主>小说情节深度解析的第94集,也是"五台山论道"系列解读的第6集[本系列共20集左右,会全部以付费形式发出],按小说解读完后会按<天道> ...
- 多目标跟踪算法FairMOT深度解析
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨周威@知乎 来源丨https://zhuanlan.zhihu.com/p/259356109 ...
- 科普|深度解析5G与未来天线技术
来源:电子万花筒 过去二十年,我们见证了移动通信从1G到4G LTE的转变.在这期间,通信的关键技术在发生变化,处理的信息量成倍增长.而天线,是实现这一跨越式提升不可或缺的组件. 按照业界的定义,天线 ...
- 深度解析:mPaaS 3.0全新组件
摘要:以"数字金融新原力(The New Force of Digital Finance)"为主题,蚂蚁金服ATEC城市峰会于2019年1月4日上海如期举办.分论坛上,蚂蚁金服产 ...
- 推荐:微服务架构的深度解析!
通过采用微服务架构,企业最大的收益是帮助内部IT建设沿着可演进的方向发展.支持灵活扩展.降低运维成本.快速响应业务变化. 这些底层技术能力的提升让业务更加敏捷.成本可控,企业也可以从中获得技术红利和市 ...
最新文章
- hdu2870暴力或者dp优化
- Elasticsearch DSL
- linux ps 代码,Linux ps命令详解(示例代码)
- css——常用选择器
- Linux下高速缓存DNS的配置
- prisma graphql 工具基本使用
- MySQL 5.7升级到8.0详细过程
- 建模国赛2016A-系泊系统的设计优秀论文
- php 下载技巧,PHP 使用技巧集
- 西威变频器avo下载调试资料_西门子变频器使用BOP-2 面板调试 G120
- Mac下Zookeeper安装及配置
- STM32——FLASH闪存编程原理与步骤
- lbp7660cdn设置网络打印_canonlbp7660cdn驱动下载-佳能lbp7660cdn打印机驱动v21.52 官方版 - 极光下载站...
- 计算机为什么无法搜索功能,电脑搜索功能不能用怎么办?电脑搜索不能用的解决方法...
- LittleVGL体验记录
- 【转】Sphinx速成指南
- 2021平凉二中高考成绩查询,平凉二中召开2020届高考启动暨教学工作推动会
- 使用Maxima求解常微分方程~
- Axure 8 设置当前动态时间
- 从零开始学Java编程!南通java招聘