Postupy: Implementace konvertoru typů

Převaděč typ lze převést hodnoty mezi typy dat a pomoci poskytnutím převodu textu na hodnotu nebo rozevíracího seznamu hodnot vyberte z konfigurace vlastností v době návrhu.Pokud správně nakonfigurována, může způsobit převaděč typ vlastnosti konfigurace kód pomocí InstanceDescriptor a System.Reflection objektů poskytnout informace potřebné k vytvoření kódu, který inicializuje vlastnosti při spuštění systému návrháře serializace.

Typ převaděče pro překlad hodnota

Typ převaděče lze použít pro hodnotu řetězce převody nebo překladem do nebo z podporovaných typů v době návrhu a v době spuštění.Hostitel, jako je například prohlížeč vlastností návrháře formulářů typ převaděče umožnit hodnota vlastnosti je znázorněno jako text pro uživatele a jejich uživatelem zadaný text převést hodnotu vhodný datový typ.

Většina nativní datové typy (Int32, String, výčet typů a další) mají výchozí typ převaděče, které poskytují hodnotu řetězce převody a ověřovací kontroly.Výchozí typ převaděče jsou System.ComponentModel s názvem oboru názvů a jsou TypeConverterNameConverter.Můžete rozšířit převaděč typ funkce výchozí není dostatečné pro vaše účely nebo implementovat vlastní typ převaděče při definování vlastní typ, který nemá přidružený typ převaděč.

[!POZNÁMKA]

A TypeConverterAttribute atribut obecně použita vlastnost nebo datový člen přiřadit typ převaděč.Pokud TypeConverterAttribute je použita typu, ji nemusí být znovu, vlastnosti nebo data členů tohoto typu.

Provedení typ převaděče je nezávislá funkce uživatelského rozhraní.Tudíž stejný typ převaděč lze použít model Windows Forms a webové formuláře.

Provádění jednoduchý typ převaděč, který můžete převést řetězec na bod

  1. Definování třídy, který je odvozen od TypeConverter.

  2. Přepsat CanConvertFrom metoda, která určuje, který typ lze převést převaděč.Tato metoda je přetížena.

  3. Přepsat ConvertFrom metoda, která implementuje převodu.Tato metoda je přetížena.

  4. Přepsat CanConvertTo metoda, která určuje typ, který můžete převést převaděč.Není nutné potlačit tuto metodu pro převod typu řetězec.Tato metoda je přetížena.

  5. Přepsat ConvertTo metoda, která implementuje převodu.Tato metoda je přetížena.

  6. Přepsat IsValid(ITypeDescriptorContext, Object) metoda, která provádí ověření.Tato metoda je přetížena.

Následující příklad kódu implementuje typu převaděč, který převádí String zadejte do Point typu a Point do String.CanConvertTo a IsValid(ITypeDescriptorContext, Object) metod v tomto příkladu se nezmění.

Option Explicit 
Option Strict

Imports System
Imports System.ComponentModel
Imports System.Globalization
Imports System.Drawing

Public Class PointConverter
   Inherits TypeConverter
   
   ' Overrides the CanConvertFrom method of TypeConverter.
   ' The ITypeDescriptorContext interface provides the context for the
   ' conversion. Typically, this interface is used at design time to 
   ' provide information about the design-time container.
   Public Overrides Overloads Function CanConvertFrom(context As ITypeDescriptorContext, sourceType As Type) As Boolean
      If sourceType Is GetType(String) Then
         Return True
      End If
      Return MyBase.CanConvertFrom(context, sourceType)
   End Function
   
   ' Overrides the ConvertFrom method of TypeConverter.
   Public Overrides Overloads Function ConvertFrom(context As ITypeDescriptorContext, culture As CultureInfo, value As Object) As Object
      If TypeOf value Is String Then
         Dim v As String() = CStr(value).Split(New Char() {","c})
         Return New Point(Integer.Parse(v(0)), Integer.Parse(v(1)))
      End If
      Return MyBase.ConvertFrom(context, culture, value)
   End Function
   
   ' Overrides the ConvertTo method of TypeConverter.
   Public Overrides Overloads Function ConvertTo(context As ITypeDescriptorContext, culture As CultureInfo, value As Object, destinationType As Type) As Object
      If destinationType Is GetType(String) Then
         Return CType(value, Point).X & "," & CType(value, Point).Y
      End If
      Return MyBase.ConvertTo(context, culture, value, destinationType)
   End Function
End Class
using System;
using System.ComponentModel;
using System.Globalization;
using System.Drawing;

public class PointConverter : TypeConverter {
   // Overrides the CanConvertFrom method of TypeConverter.
   // The ITypeDescriptorContext interface provides the context for the
   // conversion. Typically, this interface is used at design time to 
   // provide information about the design-time container.
   public override bool CanConvertFrom(ITypeDescriptorContext context, 
      Type sourceType) {
      
      if (sourceType == typeof(string)) {
         return true;
      }
      return base.CanConvertFrom(context, sourceType);
   }
   // Overrides the ConvertFrom method of TypeConverter.
   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);
   }
   // Overrides the ConvertTo method of TypeConverter.
   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);
   }
}

Typ převaděče, které obsahují seznam standardních hodnot vlastnosti okna

Převaděč typu může poskytnout seznam hodnot pro typ ovládacího prvku okno Vlastnosti.Převaděč typ poskytuje sadu standardních hodnot pro typ, zobrazí pole Položka hodnoty pro vlastnost přidružený typ ovládacího prvku vlastnosti okna zobrazující seznam hodnot, nastavte hodnotu vlastnosti má po klepnutí na šipku dolů.

Pokud je vybrána vlastnost typu, který je přidružen typ převaděč v prohlížeči vlastností návrhu prostředí, pole Položka hodnota bude obsahovat tlačítko, které zobrazí rozevírací seznam standardních hodnot pro vlastnost typ, který můžete vybrat z.

Provádění jednoduchý typ převaděč, který obsahuje rozevírací seznam standardních hodnot v prohlížeči vlastností

  1. Definování třídy, který je odvozen od TypeConverter.

  2. Přepsat GetStandardValuesSupported metoda a návrat true.

  3. Přepsat GetStandardValues metoda a návrat StandardValuesCollection standardní hodnoty pro typ vlastnosti.Standardní hodnoty pro vlastnost musí být stejného typu jako vlastní vlastnost.

  4. Přepsat CanConvertFrom metoda a návrat true pro sourceType hodnotu parametru typu řetězec.

  5. Přepsat ConvertFrom metoda a návrat na základě odpovídající hodnotu pro vlastnost value parametr.

  6. Použije TypeConverterAttribute , označuje typ konvertoru typ typu, které poskytují sadu standardních hodnot pro.

Následující příklad ukazuje typ převaděč, který obsahuje seznam standardních hodnot na ovládací prvek okno vlastností pro vlastnost typu, který je přidružen.Příklad typu převaděč podporuje vlastnosti typu celé číslo, se kterým byl spojen.Příklad použití v aplikaci Visual Studio, kompilace kódu do třídy knihovny a přidat IntStandardValuesControl komponenty do nástrojů.Přidejte instanci IntStandardValuesControl do formuláře v návrhovém režimu a přejděte TestInt vlastnost v okně Vlastnosti, když je vybraný ovládací prvek.Výběrem položky pole hodnota vlastnosti zobrazí zobrazující seznam standardních hodnot po klepnutí na rozevírací šipku dolů.Zadejte celočíselnou hodnotu bude přidat hodnotu do seznamu standardních hodnot a vlastnost zadanou hodnotu.

using System;
using System.ComponentModel;
using System.Collections;
using System.Drawing;
using System.Windows.Forms;

namespace StandardValuesTest
{  
    public class StandardValuesIntConverter : System.ComponentModel.TypeConverter
    {
        private ArrayList values;
        public StandardValuesIntConverter()
        {
            // Initializes the standard values list with defaults.
            values = new ArrayList(new int[] { 1, 2, 3, 4, 5 });
        }

        // Indicates this converter provides a list of standard values.
        public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context)
        {
            return true;
        }

        // Returns a StandardValuesCollection of standard value objects.
        public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(System.ComponentModel.ITypeDescriptorContext context)
        {        
            // Passes the local integer array.
            StandardValuesCollection svc = 
                new StandardValuesCollection(values);       
            return svc;
        }

        // Returns true for a sourceType of string to indicate that 
        // conversions from string to integer are supported. (The 
        // GetStandardValues method requires a string to native type 
        // conversion because the items in the drop-down list are 
        // translated to string.)
        public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType)
        {
            if( sourceType == typeof(string) )
                return true;
            else 
                return base.CanConvertFrom(context, sourceType);
        }

        // If the type of the value to convert is string, parses the string 
        // and returns the integer to set the value of the property to. 
        // This example first extends the integer array that supplies the 
        // standard values collection if the user-entered value is not 
        // already in the array.
        public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            if( value.GetType() == typeof(string) )
            {
                // Parses the string to get the integer to set to the property.
                int newVal = int.Parse((string)value);
            
                // Tests whether new integer is already in the list.
                if( !values.Contains(newVal) )
                {
                    // If the integer is not in list, adds it in order.
                    values.Add(newVal);
                    values.Sort();
                }                                
                // Returns the integer value to assign to the property.
                return newVal;
            }
            else
                return base.ConvertFrom(context, culture, value);
        }
    }

    // Provides a test control with an integer property associated with 
    // the StandardValuesIntConverter type converter.
    public class IntStandardValuesControl : System.Windows.Forms.UserControl
    {
        [TypeConverter(typeof(StandardValuesIntConverter))]
        public int TestInt
        {
            get
            {
                return this.integer_field;
            }
            set
            {
                if(value.GetType() == typeof(int))
                    this.integer_field = value;
            }
        }
        private int integer_field = 0;
      
        public IntStandardValuesControl()
        {
            this.BackColor = Color.White;
            this.Size = new Size(472, 80);
        }

        // OnPaint override displays instructions for the example.
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            if(this.DesignMode)
            {
                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);       
            }
        }
    }
}
Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Collections
Imports System.Drawing
Imports System.Windows.Forms

Namespace StandardValuesTest

    Public Class StandardValuesIntConverter
        Inherits System.ComponentModel.TypeConverter

        Private values As ArrayList

        Public Sub New()
            ' Initializes the standard values list with defaults.
            values = New ArrayList(New Integer() {1, 2, 3, 4, 5})
        End Sub 'New

        ' Indicates this type converter provides a list of standard values.
        Public Overloads Overrides Function GetStandardValuesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
            Return True
        End Function 'GetStandardValuesSupported

        ' Returns a StandardValuesCollection of standard value objects.
        Public Overloads Overrides Function GetStandardValues(ByVal context As System.ComponentModel.ITypeDescriptorContext) As System.ComponentModel.TypeConverter.StandardValuesCollection
            ' Passes the local integer array.
            Dim svc As New StandardValuesCollection(values)
            Return svc
        End Function 'GetStandardValues

        ' Returns true for a sourceType of string to indicate that 
        ' conversions from string to integer are supported. (The 
        ' GetStandardValues method requires a string to native type 
        ' conversion because the items in the drop-down list are 
        ' translated to string.)
        Public Overloads Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
            If sourceType Is GetType(String) Then
                Return True
            Else
                Return MyBase.CanConvertFrom(context, sourceType)
            End If
        End Function 'CanConvertFrom

        ' If the type of the value to convert is string, parses the string 
        ' and returns the integer to set the value of the property to. 
        ' This example first extends the integer array that supplies the 
        ' standard values collection if the user-entered value is not 
        ' already in the array.
        Public Overloads Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
            If value.GetType() Is GetType(String) Then
                ' Parses the string to get the integer to set to the property.
                Dim newVal As Integer = Integer.Parse(CStr(value))

                ' Tests whether new integer is already in the list.
                If Not values.Contains(newVal) Then
                    ' If the integer is not in list, adds it in order.
                    values.Add(newVal)
                    values.Sort()
                End If
                ' Returns the integer value to assign to the property.
                Return newVal
            Else
                Return MyBase.ConvertFrom(context, culture, value)
            End If
        End Function 'ConvertFrom
    End Class 'StandardValuesIntConverter

    ' 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

Typ převaděče, které při generování kódu pro inicializační vlastnosti v době spuštění

Na.NET Framework poskytuje možnost Generovat kód inicializaci dynamické vlastnosti v době návrhu, který bude v době spuštění inicializace vlastnosti.

Vývojáři mohou vytvářet typu převaděč, který vytváří závislosti konstruktoru inicializační kód.Tyto převaděče typu může generovat kód konstruktor dynamicky pomocí hodnoty nastavené v době návrhu pro konfiguraci vlastností typu v době spuštění.Převaděč typ implementuje logiku konfigurace typu a hodnoty pro vlastnost konstruktoru.

Pokud potřebujete vytvořit kód kromě konstruktor inicializovat vlastnost, je možné dynamicky generovat kód vlastní implementací CodeDomSerializer a použití DesignerSerializerAttribute associates, vaše CodeDomSerializer pro typ typu.Tento postup se obvykle používá pouze pro scénáře, ve kterých je důležité generování kódu dynamicky řízené nebo přizpůsobené pro inicializaci komponenty.Další informace o této metodě naleznete v dokumentaci k CodeDomSerializer.

Vytvořit vlastnost konstruktoru inicializátor musíte spojit s typ vlastnosti inicializace převaděč typu a musí být schopen převést na typ převaděč InstanceDescriptor.

K implementaci typu převaděč, který vytváří kód inicializace vlastností konstruktor

  1. Definování třídy, který je odvozen od TypeConverter.

  2. Přepsat CanConvertTo metoda.Pokud destinationType parametr rovná InstanceDescriptor typ, vrátit true.

  3. Přepsat ConvertTo metoda.Pokud destinationType parametr rovná InstanceDescriptor zadejte, sestavit a vrátit InstanceDescriptor , představuje konstruktor a argumenty konstruktoru pro generování kódu pro.Vytvořit InstanceDescriptor , představuje odpovídající konstruktor a parametry, získat ConstructorInfo z Type vlastnosti jsou inicializace voláním GetConstructornebo GetConstructors metoda s podpisem odpovídající metodu konstruktoru hledáte.Vytvořte nový popisovač instance a předat ConstructorInfo typu, který představuje konstruktor typu použití, spolu s pole parametru objektů odpovídající konstruktor podpis.

Následující příklad implementuje typu převaděč, který může generovat kód inicializace vlastností konstruktor pro vlastnosti typu Point.

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);      
}

Probíhá kompilace kódu

  • Při vývoji vlastní TypeConverter, je vhodné nastavit číslo sestavení přibývá s každou sestavení.To zabrání verze starší, mezipaměti vaše TypeConverter z vytvořených v návrhovém prostředí.

Viz také

Koncepty

Převod zobecněného typu