Convertisseur de type, exemple

Mise à jour : novembre 2007

Cet exemple montre comment créer un convertisseur de type nommé AuthorConverter,utilisé avec l'objet Author, à partir d'autres exemples de création de contrôle. ASP.NET utilise des convertisseurs de type au moment de l'exécution pour sérialiser et désérialiser des objets stockés dans l'état du contrôle et dans l'état d'affichage. L'exemple AuthorConverter convertit un objet Author en String et une représentation String en objet Author. Le type Author est décrit dans Propriétés de contrôle serveur, exemple.

Vous devez associer un convertisseur de type à un type (ou à une propriété du type pour lequel le convertisseur est défini) en utilisant TypeConverterAttribute. AuthorConverter permet au contrôle Book de stocker la propriété Author dans l'état d'affichage. Un type personnalisé ne peut être stocké dans l'état d'affichage que s'il est associé à un convertisseur de type défini pour lui.

La classe AuthorConverter dérive de ExpandableObjectConverter, de telle sorte que l'explorateur de propriétés dans un concepteur visuel puisse fournir une interface utilisateur Développer/Réduire pour modifier les sous-propriétés du type Author.

Liste du code de la 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);
        }
    }
}

Explication du code

L'implémentation de la classe AuthorConverter illustre les tâches que vous devez effectuer pour convertir une instance de Author en chaîne et inversement :

  • Substituez la méthode CanConvertFrom, qui détermine si une instance Author peut être créée à partir d'un type particulier. Elle retourne true si le type passé est de type String.

  • Substituez la méthode CanConvertTo, qui détermine si une instance Author peut être convertie en un type particulier. Elle retourne true si le type passé est de type String.

  • Substituez la méthode ConvertFrom, qui retourne une chaîne contenant les propriétés FirstName, MiddleName et LastName de l'instance de Author.

  • Substituez la méthode ConvertTo, qui analyse une chaîne contenant les propriétés concaténées FirstName, MiddleName et LastName d'une instance de Author. Elle retourne une nouvelle instance de la classe Author avec les données de la chaîne concaténée.

Génération et utilisation de l'exemple

Compilez la classe AuthorConverter avec le contrôle Book et ses classes associées, décrites dans Propriétés de contrôle serveur, exemple.

Pour plus d'informations sur la compilation et l'utilisation des exemples de contrôle personnalisés, consultez Exemples de création de contrôles serveur personnalisés.

Voir aussi

Concepts

Types valeur du système de type commun

Autres ressources

Développement de contrôles serveur ASP.NET personnalisés