Sdílet prostřednictvím


Beispiel für einen Typkonverter

Aktualisiert: November 2007

Dieses Beispiel zeigt, wie Sie einen Typkonverter mit dem Namen AuthorConverter erstellen, der mit dem Author-Objekt aus anderen Beispielen für das Erstellen von Steuerelementen verwendet wird. ASP.NET verwendet Typkonverter zur Laufzeit, um im Steuerelementzustand und im Ansichtszustand gespeicherte Objekte zu serialisieren und zu deserialisieren. Im AuthorConverter-Beispiel wird ein Author-Objekt in String und eine String-Darstellung in ein Author-Objekt konvertiert. Der Author-Typ wird in Beispiel für die Eigenschaften eines Serversteuerelements beschrieben.

Die Verknüpfung eines Typkonverters mit einem Typ (oder mit einer Eigenschaft des Typs, für den der Konverter definiert ist) erfolgt über das TypeConverterAttribute. Mit AuthorConverter kann das Book-Steuerelement die Author-Eigenschaft im Ansichtszustand speichern. Ein benutzerdefinierter Typ kann nur im Ansichtszustand gespeichert werden, wenn ein Typkonverter für diesen Typ definiert und ihm zugeordnet ist.

Die AuthorConverter-Klasse ist von ExpandableObjectConverter abgeleitet. Somit kann der Eigenschaftenbrowser eines visuellen Designers eine Benutzeroberfläche zum Erweitern/Reduzieren bereitstellen, mit der sich die untergeordneten Eigenschaften des Author-Typs bearbeiten lassen.

Codeauflistung für die AuthorConverter-Klasse

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

Codeerläuterung

Die Implementierung der AuthorConverter-Klasse zeigt die Schritte, die Sie zum Konvertieren einer Author-Instanz in eine Zeichenfolge oder umgekehrt ausführen müssen:

  • Überschreiben der CanConvertFrom-Methode, die bestimmt, ob aus einem bestimmten Typ eine Author-Instanz erstellt werden kann. Sie gibt true zurück, wenn der übergebene Typ vom Typ String ist.

  • Überschreiben der CanConvertTo-Methode, die bestimmt, ob eine Author-Instanz in einen bestimmten Typ konvertiert werden kann. Sie gibt true zurück, wenn der übergebene Typ vom Typ String ist.

  • Überschreiben der ConvertFrom-Methode, die eine Zeichenfolge mit den Eigenschaften FirstName, MiddleName und LastName der Author-Instanz zurückgibt.

  • Überschreiben der ConvertTo-Methode, die eine Zeichenfolge aus den verketteten Eigenschaften FirstName, MiddleName und LastName der Author-Instanz analysiert. Sie gibt eine neue Instanz der Author-Klasse mit den Daten aus der verketteten Zeichenfolge zurück.

Erstellen und Verwenden des Beispiels

Kompilieren Sie die AuthorConverter-Klasse mit dem Book-Steuerelement und seinen verknüpften Klassen, die in Beispiel für die Eigenschaften eines Serversteuerelements beschrieben werden.

Weitere Informationen über das Kompilieren und Verwenden der benutzerdefinierten Beispielsteuerelemente finden Sie unter Erstellen der Beispiele für benutzerdefinierte Serversteuerelemente.

Siehe auch

Konzepte

Werttypen im allgemeinen Typsystem

Weitere Ressourcen

Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen