博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度解析 TypeConverter & TypeConverterAttribute (二)
阅读量:6441 次
发布时间:2019-06-23

本文共 3994 字,大约阅读时间需要 13 分钟。

TypeConverterAttribute Class

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

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

如果你对Attribute不太了解可以先看看,或者看看

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页面显示(也可以说是持久)的方式,有几种详见
这样就可以达到效果如下([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://blog.csdn.net/luyifeiniu/article/details/5107839

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

你可能感兴趣的文章
PHP单例模式的实现
查看>>
httpClient post 数据传输和处理
查看>>
newLISP你也行 --- 字符串
查看>>
插入排序
查看>>
【译】Swift 2.0 下面向协议的MVVM架构实践
查看>>
全屏滑动代码
查看>>
java的一个小问题。
查看>>
mybatis多条件查询
查看>>
helm 部署和简单使用
查看>>
完全背包
查看>>
AngularJS 路由的安全性处理
查看>>
infinite-scroll学习(一)
查看>>
log4j-Note
查看>>
oracle 数据库的exp/imp
查看>>
nginx学习八 代理服务
查看>>
Linux Oracle服务启动&停止脚本与开机自启动
查看>>
反射动态获取和设置对象的值
查看>>
win10应用商店 天气 日历 照片 感叹号
查看>>
css,高度按宽度比例调整方式
查看>>
ORACLE 11g命令行中上下左右无法使用解决方式
查看>>