闪客动漫天地论坛

首页 » 设计乐园 » 彩信制作乐园 » 再续:如何:实现类型转换器
女女 - 2007-6-19 10:27:00
' Provides a test control with an integer property associated with the
    ' StandardValuesIntConverter type converter.
    Public Class IntStandardValuesControl
        Inherits System.Windows.Forms.UserControl

        <TypeConverter(GetType(StandardValuesIntConverter))> _
        Public Property TestInt() As Integer
            Get
                Return Me.integer_field
            End Get
            Set(ByVal Value As Integer)
                If Value.GetType() Is GetType(Integer) Then
                    Me.integer_field = Value
                End If
            End Set
        End Property
        Private integer_field As Integer = 0

        Public Sub New()
            Me.BackColor = Color.White
            Me.Size = New Size(472, 80)
        End Sub 'New

        ' OnPaint override displays instructions for the example.
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            If Me.DesignMode Then
                e.Graphics.DrawString("TypeConverter.GetStandardValues Example Control", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Blue), 5, 5)
                e.Graphics.DrawString("The type converter for the TestInt property of this", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, 20)
                e.Graphics.DrawString("component provides a list of standard values to the", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, 30)
                e.Graphics.DrawString("Properties window. Setting a value through a property", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, 40)
                e.Graphics.DrawString("grid adds it to the list of standard values.", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, 50)
            Else
                e.Graphics.DrawString("TypeConverter.GetStandardValues Example Control", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Blue), 5, 5)
                e.Graphics.DrawString("This control was intended for use in design mode.", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, 20)
            End If
        End Sub 'OnPaint
    End Class 'IntStandardValuesControl
End Namespace 'StandardValuesTest


在运行时为属性初始化生成代码的类型转换器
.NET Framework 提供了在设计时生成动态属性初始化代码(此代码在运行时初始化属性)的功能。

开发人员可以构建一个产生基于构造函数的初始化代码的类型转换器。为了在运行时配置类型属性,这些类型转换器可以使用在设计时设置的值来动态生成构造函数代码。类型转换器实现逻辑以配置属性的类型和构造函数的值。

为了初始化属性,除了生成构造函数之外,如果您还需要生成代码,可以实现一个自定义的 CodeDomSerializer,并应用将类型的 CodeDomSerializer 与该类型关联的 DesignerSerializerAttribute,这样就可以动态地生成代码。通常只有在对组件初始化的代码生成进行动态控制或自定义很重要的情况下,才使用这种方法。有关该方法的更多信息,请参见 CodeDomSerializer 文档。

要生成自定义的基于构造函数的属性初始值设定项,必须将类型转换器与要初始化的属性的类型进行关联,而且该类型转换器必须能够转换到 InstanceDescriptor。

实现生成基于构造函数的属性初始化代码的类型转换器
定义一个从 TypeConverter 派生的类。

重写 CanConvertTo 方法。如果 destinationType 参数等于 InstanceDescriptor 类型,则返回 true。

重写 ConvertTo 方法。如果 destinationType 参数等于 InstanceDescriptor 类型,构造并返回一个 InstanceDescriptor,表示要为之生成代码的构造函数和构造函数参数。若要创建表示相应的构造函数和参数的 InstanceDescriptor,可通过调用具有您正在查找的构造函数的相应方法签名的 GetConstructor 或 GetConstructors 方法从正在初始化的属性的 Type 获得 ConstructorInfo。然后创建一个新的实例说明符,并为表示待用构造函数类型的类型传递 ConstructorInfo,同时传递与构造函数签名匹配的参数对象数组。

下面的示例实现了一个类型转换器,该转换器可以为类型 Point 的属性生成基于构造函数的属性初始化代码。

C#  复制代码
public class PointConverter : TypeConverter
{
  public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
  {
      if (destinationType == typeof(InstanceDescriptor))
        return true;
      return base.CanConvertTo(context, destinationType);
  }

public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
      // Insert other ConvertTo operations here.
      //
      if (destinationType == typeof(InstanceDescriptor) &&
value is Point)
  {
        Point pt = (Point)value;

      ConstructorInfo ctor = typeof(Point).GetConstructor(
new Type[] {typeof(int), typeof(int)});
      if (ctor != null)
      {
        return new InstanceDescriptor(ctor, new object[] {pt.X, pt.Y});
}
}
  return base.ConvertTo(context, culture, value, destinationType);     
}
 1 
查看完整版本: 再续:如何:实现类型转换器