一起谈.NET技术,ASP.NET2.0服务器控件之类型转换器

简介: 类型转换器是实现自定义服务器控件属性过程中比较重要的内容。本文将对类型转换器的基本概念和实现方法进行介绍。  1. 类型转换器基本概念  类型转换器是自定义服务器控件的辅助性功能实现。它主要用于执行从字符串表示形式到指定类型之间的双向转换。

      类型转换器是实现自定义服务器控件属性过程中比较重要的内容。本文将对类型转换器的基本概念和实现方法进行介绍。
  1. 类型转换器基本概念
  类型转换器是自定义服务器控件的辅助性功能实现。它主要用于执行从字符串表示形式到指定类型之间的双向转换。例如,以文本形式表示属性值,将用户输入的文本转换为相应数据类型等等,都应用了类型转换器。

  对于多数基本数据类型(如Int32、Bool、Char、String、枚举类型等),.NET框架已经为它们提供了默认的类型转换器,这些类型转换器完成从字符串到相关值的转换并执行验证检查的功能。默认的类型转换器派生自System.ComponentModel.TypeConverter类,名为TypeConverterNameConverter。例如,当开发人员在*.aspx文件中设置服务器控件属性时会发现,某些属性值为基本类型,即Bool、Char、Enum、Int等,但是,一律被设置为String类型,这就牵扯到一个类型转换的问题。例如,属性Height="150px",属性值"150px"在设置时是String类型,而这里的属性值应当作为Unit类型,那么所面临的问题就是必须要求页面编译器将字符串"150px"转换为Unit类型。通常情况下,对于属性值为基本类型的属性,页面编译器将自动应用相关的类型转换器完成转换工作。在刚才的例子中,页面编译器将自动调用类型转换器System.Web.UI.WebControls.UnitConverter完成String类型与Unit类型之间的相互转换。
  然而,上面的方法只能解决少数比较简单的类型转换问题,并且在多数情况下,相关的类型转换过程都是默认自动完成的。当默认类型转换器无法满足需要时,例如,对于复杂属性的情况,是没有关联的默认类型转换器时,则可以通过实现自定义类型转换器来实现。
  自定义类型转换器是本文的重点内容。按照自定义类型转换器的功能分类,可以将自定义类型转换器分为3种:
  · 值翻译的类型转换器;
  这种类型转换器最为常见,它主要完成从字符串到值得转换,或用于在设计时和运行时进行数据类型之间的双向翻译。例如,实现从String类型转换为表示在二维平面中定义点的、整数X和Y坐标的有序对Point类型,或者从Point类型转换为String类型。此处的String类型与Ponit类型之间的双向转换,则需要实现一个值翻译的类型转换器。
  · 向属性窗口提供标准值列表的类型转换器;
  在Visual Studio 2005中包括控件属性窗口。类型转换器可以为属性窗口中控件的类型提供一个值列表。当开发人员单击值列表时,则可以方便的在下拉列表中设置属性的值。
  · 在运行时为属性初始化生成代码的类型转换器;
  .NET Framework 提供了在设计时生成动态属性初始化代码(此代码在运行时初始化属性)的功能。开发人员可以构建一个产生基于构造函数的初始化代码的类型转换器。为了在运行时配置类型属性,这些类型转换器可以使用在设计时设置的值来动态生成构造函数代码。类型转换器实现逻辑以配置属性的类型和构造函数的值。
  实现以上3种类型转换器都要求自定义类型转换器的类必须继承自System.ComponentModel.TypeConverter基类,或者TypeConverter类的已有子类。下面简单介绍一下TypeConverter及其子类的基本情况。
  TypeConverter类主要提供了一种将值的类型转换为其他类型,以及访问标准值和子属性的统一方法。该类包括多个成员方法。对于创建自定义类型转换器而言,读者应了解以下几个常见方法:
      (1)CanConvertFrom方法:返回该转换器是否可以将一种类型的对象转换为此转换器的类型。
  (2)ConvertFrom方法:将给定值转换为此转换器的类型。
  (3)CanConvertTo方法:返回此转换器是否可将该对象转换为指定的类型。
  (4)ConvertTo方法:将给定值对象转换为指定的类型。
  (5)IsValid方法:返回给定值对象对于此类型是否有效。
  (6)GetStandardValuesSupported方法:返回此对象是否支持可以从列表中选取的标准值集。
  (7)GetStandardValues方法:返回此类型转换器设计用于的数据类型的标准值集合。
  TypeConverter类是实现类型转换器的基础。为了支持默认类型转换功能,ASP.NET 2.0还对TypeConverter类进行了扩展,其内置了多个派生类。例如,CharConverter、DateTimeConverter、ExpandableObjectConverter、EnumConverter等。它们在完成类型转换的同时,还可以帮助开发人员创建自定义类型转换器,例如,可创建继承自ExpandableObjectConverter类的类型转换器,该基类提供了在可扩展对象与其他各种表示形式之间实现转换的类型转换器。这样就可以简化(相对于从TypeConverter基类)创建类型转换器的过程。
  另外,在使用已有类型转换器过程要注意:无论何时都不要直接访问类型转换器。而应通过使用TypeDescriptor调用适当的转换器。
  当实现类型转换器之后,可以使用如下方法应用类型转换器。

[TypeConverter(typeof(MyClassConverter))]
public class MyClass {
 // Insert code here.
} 

  以上代码显示了类型转换器的应用方法。其通知MyClass使用名为MyClassConverter的类型转换器。此示例假定已在其他位置实现了MyClassConverter。在应用过程中需要注意,元数据属性TypeConverter通常应用于复杂属性或数据成员,以将其与类型转换器关联。如果将TypeConverter应用于类型,则不必将其再次应用于该类型的属性或数据成员。
 2.值翻译的类型转换器
  值翻译的类型转换器主要完成属性值类型与String类型之间的相互转换功能。为了实现这个类型转换器,开发人员可使类型转换器类自TypeConverter基类派生,并且重写其中的多个方法。请看下面的实例。
  下面的代码实现一个类型转换器类PointConverter,它将String类型转换为System.Drawing.Point类型,将System.Drawing.Point类型转换为String类型。 

using System;
using System.ComponentModel;
using System.Globalization;
using System.Drawing;
//实现类型转换器的类应继承自TypeConverter类
public class PointConverter : TypeConverter{ 
 //重写CanConvertFrom方法 
 public override bool CanConvertFrom(ITypeDescriptorContext context,Type sourceType){
  if (sourceType == typeof(string)){
   return true; 
  }
  return base.CanConvertFrom(context, sourceType);
 }
 //重写ConvertFrom方法 
 public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture, object value){
if (value is string){
   string[] v = ((string)value).Split(new char[] {','});
   return new Point(int.Parse(v[0]), int.Parse(v[1]));
  }
  return base.ConvertFrom(context, culture,value); 
 }//重写ConvertTo方法 
 public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType){ 
  if (destinationType == typeof(string)){ 
   return ((Point)value).X ","((Point)value).Y;
  }
  return base.ConvertTo(context, culture,value, destinationType); 
 }
}

   上面的代码展示了典型的值翻译类型转换器的创建方法。本例中主要重写了TypeConverter类的4个方法。
  (1)定义从System.ComponentModel.TypeConverter派生的类PointConverter;
  (2)重写CanConvertFrom方法,指定转换器可将String类型转换为Point类型,并调用基类实现;
  (3)重写ConvertFrom方法,指定将String类型转换为Point类型的具体实现方法,并调用基类实现;
  (4)重写ConvertTo方法,指定将Point类型转换为String类型的具体实现方法,并调用基类实现;
  实际上,在通常情况下,对于实现值翻译的类型转换器除需重写上述4个TypeConverter类成员方法之外,还需要重写CanConvertTo和IsValid方法。注意:如果是转换为String类型,则不需要重写该方法。在上面的代码中,是转换将Point类型转换为String类型,因此不重写CanConvertTo方法。同时,本例中无需验证,因此没有重写IsValid方法。
  值翻译的类型转换器在控件开发中应用广泛。很多情况下,控件开发人员可能忘记创建转换器而导致控件无法编译,出现一些莫明其妙的错误,因此建议读者仔细体会,重点掌握。  

  3.向属性窗口提供标准值列表的类型转换器
  类型转换器可以为Visual Studio 2005的属性窗口中的属性值输入字段,提供一个标准值列表,那么当在属性浏览器中选中了与该类型转换器关联的类型属性时,值输入字段将包含一个按钮,该按钮显示属性类型的标准值下拉列表,可从中选择标准值。
  实现在属性窗口中提供标准值下拉列表的类型转换器有以下6个步骤:
  (1)定义从System.ComponentModel.TypeConverter派生的类;
  (2)重写GetStandardValuesSupported方法并返回true;
  (3)重写GetStandardValues方法并返回包含属性类型标准值的StandardValuesCollection。属性类型的标准值必须是类型字符串;
  (4)重写CanConvertFrom方法并为类型字符串的sourceType参数值返回true;
  (5)重写ConvertFrom方法并基于"值"参数返回相应的属性值;
  (6)将指示类型转换器类型的TypeConverterAttribute应用于要为其提供一组标准值的类型。
  限于篇幅,本文将不再列举代码示例。关于实现过程中的方法应用,读者可参考前文相关内容或者MSDN。
  4.在运行时为属性初始化生成代码的类型转换器
  .NET框架中提供了在设计时生成可动态配置的属性初始化代码(此代码在运行时初始化属性)的功能。开发人员可以构建一个产生基于构造函数的初始化代码的类型转换器。为了在运行时配置类型属性,这些类型转换器可以使用在设计时设置的值来动态生成构造函数代码。类型转换器实现逻辑以配置属性的类型和构造函数的值。

为了初始化属性,除了生成构造函数之外,如果您还需要生成代码,可以实现一个自定义的CodeDomSerializer,并应用将类型的CodeDomSerializer与该类型关联的 DesignerSerializerAttribute,这样就可以动态地生成代码。通常只有在对组件初始化的代码生成进行动态控制或自定义很重要的情况下,才使用这种方法。要生成自定义的基于构造函数的属性初始化程序,必须将类型转换器与属性的类型关联来进行初始化,而且该类型转换器必须能够转换到InstanceDescriptor。
  实现生成基于构造函数的属性初始化代码的类型转换器有3个步骤:
  (1)定义从System.ComponentModel.TypeConverter派生的类;
  (2)重写CanConvertTo方法。如果destinationType 参数等于InstanceDescriptor类型,返回true;
  (3)重写ConvertTo方法。如果destinationType参数等于InstanceDescriptor 类型,构造并返回一个InstanceDescriptor,表示要为之生成代码的构造函数和构造函数参数。要创建表示相应构造函数及参数的InstanceDescriptor,可通过使用您所查找的构造函数的相应方法签名来调用GetConstructor或GetConstructors方法,从要初始化的属性的Type中获取ConstructorInfo。然后创建一个新的实例说明符,并为表示待用构造函数类型的类型传递ConstructorInfo,同时传递与构造函数签名匹配的参数对象数组;
  5.小结
  本文主要介绍了类型转换器的基本概念以及3种类型转换器的实现方法。尤其需要读者关注的是其中的值翻译的类型转换器,这是作为开发人员应重点掌握的内容。

目录
相关文章
|
存储 机器学习/深度学习 数据库
阿里云服务器X86/ARM/GPU/裸金属/超算五大架构技术特点、场景适配参考
在云计算技术飞速发展的当下,云计算已经渗透到各个行业,成为企业数字化转型的关键驱动力。选择合适的云服务器架构对于提升业务效率、降低成本至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供大家了解和选择参考。
1831 61
|
存储 机器学习/深度学习 人工智能
硅谷GPU单节点服务器:技术解析与应用全景
“硅谷GPU单节点服务器”代表了在单个物理机箱内集成强大计算能力,特别是GPU加速能力的高性能计算解决方案。它们并非指代某个特定品牌,而是一类为处理密集型工作负载而设计的服务器范式的统称。
|
监控 Cloud Native 测试技术
.NET技术深度解析:现代企业级开发指南
每日激励:“不要一直责怪过去的自己,他曾经站在雾里也很迷茫”。我是蒋星熠Jaxonic,一名在代码宇宙中探索的极客旅人。从.NET Framework到.NET 8,我深耕跨平台、高性能、云原生开发,践行领域驱动设计与微服务架构,用代码书写技术诗篇。分享架构演进、性能优化与AI融合前沿,助力开发者在二进制星河中逐光前行。关注我,共探技术无限可能!
.NET技术深度解析:现代企业级开发指南
|
人工智能 运维 安全
MCP协议深度解析:客户端-服务器架构的技术创新
作为一名长期关注AI技术发展的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP协议作为Anthropic公司推出的开放标准,正在重新定义AI应用与外部系统的交互方式,其基于JSON-RPC 2.0的通信机制为构建可扩展、安全的AI应用提供了坚实的技术基础。在深入研究MCP协议规范的过程中,我发现这一协议不仅解决了传统AI应用在资源访问、工具调用和上下文管理方面的痛点,更通过其独特的三大核心概念——资源(Resources)、工具(Tools)、提示词(Prompts)——构建了一个完整的AI应用生态系统。MCP协议的客户端-
962 0
MCP协议深度解析:客户端-服务器架构的技术创新
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
520 22
|
存储 机器学习/深度学习 算法
阿里云X86/ARM/GPU/裸金属/超算等五大服务器架构技术特点、场景适配与选型策略
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别。本文将深入解析这些架构的特点、优势及适用场景,帮助用户更好地根据实际需求做出选择。
|
存储 机器学习/深度学习 人工智能
阿里云第八代云服务器c8i与g8i深度解析:技术对比、场景适配与选购指南
阿里云服务器计算型c8i与通用型g8i实例属于阿里云的第八代云服务器实例规格,是除了计算型c7与c8y和通用型g7与g8y之外同样深受用户喜欢的云服务器实例规格。本文将详细解析计算型c8i与通用型g8i实例的技术特性、适用场景、性能优势,以及最新的活动价格情况,并为用户提供购买建议。
|
存储 弹性计算 人工智能
阿里云服务器ECS g8i实例怎么样?新一代g8i实例技术特性与场景应用解析
阿里云服务器ECS g8i实例怎么样?对于很多企业用户说,云服务器的性能、安全性和AI能力是用户非常关注的。无论是处理大规模数据、运行复杂算法,还是保障业务应用的安全,都需要云服务器具备卓越的性能和强大的功能。阿里云推出的第八代云服务器ECS g8i实例,凭借其卓越的性能、增强的AI能力和全面的安全防护,成为了市场关注的焦点。本文将为大家解析ECS g8i实例的技术特性、产品优势、适用场景及与同类产品的对比,同时介绍其收费标准和活动价格,以供大家了解和选择。
阿里云服务器ECS g8i实例怎么样?新一代g8i实例技术特性与场景应用解析
|
存储 弹性计算 安全
ECS与VPS技术角力:从算力成本到免备案雷区,企业服务器选型合规指南
在数字化浪潮中,服务器选择至关重要。ECS(云服务器)和VPS(虚拟专用服务器)是热门选项。ECS基于云计算,提供高可用性和弹性伸缩,适合大型项目;VPS通过分割物理服务器实现资源独立,成本较低,适合小型应用。两者在网络、存储及计算性能上各有优劣,需根据需求选择。国内并不存在合法的免备案服务器,建议严格遵守法规,确保网站合法运营。
1032 3
|
SQL 小程序 API
如何运用C#.NET技术快速开发一套掌上医院系统?
本方案基于C#.NET技术快速构建掌上医院系统,结合模块化开发理念与医院信息化需求。核心功能涵盖用户端的预约挂号、在线问诊、报告查询等,以及管理端的排班管理和数据统计。采用.NET Core Web API与uni-app实现前后端分离,支持跨平台小程序开发。数据库选用SQL Server 2012,并通过读写分离与索引优化提升性能。部署方案包括Windows Server与负载均衡设计,确保高可用性。同时针对API差异、数据库老化及高并发等问题制定应对措施,保障系统稳定运行。推荐使用Postman、Redgate等工具辅助开发,提升效率与质量。
794 0