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)