Compartilhar via


Exemplo de Conversor de Tipo

Este exemplo mostra como criar um conversor de tipo chamado AuthorConverter, queé usado com o Author objeto de Outros controle exemplos de criação. O ASP.NET usa conversores de tipos em tempo de execução para serializar e desserializar objetos armazenados em estado do controle e em estado de exibição.O exemplo AuthorConverter converte um objeto Author em uma String a uma representação String em um objeto Author.O tipo Author está descrito em Exemplo das propriedades de controle do servidor.

Associar um conversor de tipo de um tipo (ou com uma propriedade do tipo para o qual o conversor está definido) usando o TypeConverterAttribute. AuthorConverter permite que o Book controle para armazenar o Author propriedade no estado da exibição. Um tipo personalizado pode ser armazenado em estado de exibição somente se ele tiver um conversor de tipos definido para ele e associado com o tipo.

A classe AuthorConverter deriva de ExpandableObjectConverter para que o navegador de propriedades em um designer visual possa fornecer uma interface do usuário expandir/reduzir para editar as subpropriedades do tipo Author.

Listagem de código para a classe AuthorConverter

' AuthorConverter.vb
Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Design.Serialization
Imports System.Globalization
Imports System.Reflection

Namespace Samples.AspNet.VB.Controls
    Public Class AuthorConverter
        Inherits ExpandableObjectConverter

        Public Overrides Function CanConvertFrom( _
        ByVal context As ITypeDescriptorContext, _
            ByVal sourceType As Type) As Boolean
            If sourceType Is GetType(String) Then
                Return True
            End If
            Return MyBase.CanConvertFrom(context, sourceType)
        End Function

        Public Overrides Function CanConvertTo( _
        ByVal context As ITypeDescriptorContext, _
            ByVal destinationType As Type) As Boolean
            If destinationType Is GetType(String) Then
                Return True
            End If
            Return MyBase.CanConvertTo(context, destinationType)
        End Function

        Public Overrides Function ConvertFrom( _
        ByVal context As ITypeDescriptorContext, _
        ByVal culture As CultureInfo, ByVal value As Object) As Object
            If value Is Nothing Then
                Return New Author()
            End If

            If (TypeOf value Is String) Then
                Dim s As String = CStr(value)
                If s.Length = 0 Then
                    Return New Author()
                End If

                Dim parts() As String = s.Split(" ".ToCharArray)

                ' Determine if name is stored as first and last, 
                ' first, middle, and last,
                ' or is in error.
                If (parts.Length < 2) Or (parts.Length > 3) Then
                    Throw New ArgumentException( _
                        "Name must have 2 or 3 parts.", "value")
                End If

                If parts.Length = 2 Then
                    Return New Author(parts(0), parts(1))
                End If

                If parts.Length = 3 Then
                    Return New Author(parts(0), parts(1), parts(2))
                End If
            End If
            Return MyBase.ConvertFrom(context, culture, value)
        End Function

        Public Overrides Function ConvertTo( _
            ByVal context As ITypeDescriptorContext, _
        ByVal culture As CultureInfo, ByVal value As Object, _
        ByVal destinationType As Type) As Object
            If value IsNot Nothing Then
                If Not (TypeOf value Is Author) Then
                    Throw New ArgumentException("Invalid Author", _
                        "value")
                End If
            End If

            If destinationType Is GetType(String) Then
                If value Is Nothing Then
                    Return String.Empty
                End If

                Dim auth As Author = CType(value, Author)

                If auth.MiddleName <> String.Empty Then
                    Return String.Format("{0} {1} {2}", _
                    auth.FirstName, _
                    auth.MiddleName, _
                    auth.LastName)
                Else
                    Return String.Format("{0} {1}", _
                         auth.FirstName, _
                        auth.LastName)
                End If
            End If

            Return MyBase.ConvertTo(context, culture, value, _
                destinationType)
        End Function

    End Class
End Namespace
// AuthorConverter.cs
using System;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Globalization;
using System.Reflection;

namespace Samples.AspNet.CS.Controls
{
    public class AuthorConverter : ExpandableObjectConverter
    {
        public override bool CanConvertFrom(
            ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }

        public override bool CanConvertTo(
            ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(string))
            {
                return true;
            }
            return base.CanConvertTo(context, destinationType);
        }

        public override object ConvertFrom(ITypeDescriptorContext 
            context, CultureInfo culture, object value)
        {
            if (value == null)
            {
                return new Author();
            }

            if (value is string)
            {
                string s = (string)value;
                if (s.Length == 0)
                {
                    return new Author();
                }

                string[] parts = s.Split(' ');

                        // Determine if name is stored as first and 
                        // last; first, middle, and last;
                        // or is in error.
                if ((parts.Length < 2) || (parts.Length > 3))
                {
                    throw new ArgumentException(
                        "Name must have 2 or 3 parts.", "value");
                }

                if (parts.Length == 2)
                {
                    return new Author(parts[0], parts[1]);
                }

                if (parts.Length == 3)
                {
                    return new Author(parts[0], parts[1], parts[2]);
                }
            }

            return base.ConvertFrom(context, culture, value);
        }

        public override object ConvertTo(
            ITypeDescriptorContext context,
            CultureInfo culture, object value, Type destinationType)
        {
            if (value != null)
            {
                if (!(value is Author))
                {
                    throw new ArgumentException(
                        "Invalid Author", "value");
                }
            }

            if (destinationType == typeof(string))
            {
                if (value == null)
                {
                    return String.Empty;
                }

                Author auth = (Author)value;

                if (auth.MiddleName != String.Empty)
                {
                    return String.Format("{0} {1} {2}",
                        auth.FirstName,
                        auth.MiddleName,
                        auth.LastName);
                }
                else
                {
                    return String.Format("{0} {1}",
                         auth.FirstName,
                        auth.LastName);
                }
            }

            return base.ConvertTo(context, culture, value, 
                destinationType);
        }
    }
}

Discussão de Código

A implementação da classe AuthorConverter ilustra as tarefas que você deve executar para converter uma instância de Author em uma sequência de caracteres:

  • Substituir o método CanConvertFrom, que determina se uma instância Author pode ser criada a partir de um determinado tipo.Retorna true se o tipo passado é do tipo String.

  • Substituir o método CanConvertTo, que determina se uma instância Author pode ser criada a partir de um determinado tipo.Retorna true se o tipo passado é do tipo String.

  • Substituir o método ConvertFrom, que retorna uma sequência de caracteres que contém as propriedades FirstName,MiddleName e LastName da instância Author.

  • Substituir o método ConvertTo, que analisa uma sequência de caracteres que contém as propriedades FirstName, MiddleName e LastName concatenadas de uma instância Author.Ele retorna uma nova instância da classe Author com os dados da sequência de caracteres concatenada.

Construindo e Usando o Exemplo

Compile a classe AuthorConverter com o controle Book e suas classes relacionadas, que são descritos em Exemplo das propriedades de controle do servidor.

Para obter informações sobre a compilação e uso dos exemplos de controles personalizados, consulte Construindo os Exemplos de Controle de Servidor Personalizado.

Consulte também

Conceitos

Tipos de valores no CTS (Common Type System)

Outros recursos

Desenvolvendo Controles Personalizados ASP.NET Server