Frage

Ich möchte von Convert.ChangeType in C # Konvertierung zwischen zwei Bibliotheksklassen implementieren. Ich kann keine der beiden Arten ändern. Zum Beispiel der Umwandlung zwischen Guid und byte [].

Guid g = new Guid();
object o1 = g;
byte[] b = (byte[]) Convert.ChangeType(o1, typeof(byte[])); // throws exception

Ich bin mir bewusst, dass Guid eine ToByteArray () -Methode liefert, aber ich möchte, dass genannt haben, wenn Guid [] auf Byte umgewandelt wird. Der Grund dafür ist, dass die Umwandlung erfolgt auch in der Bibliothek Code (AseDataAdapter), die ich nicht ändern kann. So ist es möglich, eine Konvertierungsregel zwischen zwei Typen zu definieren, ohne den Sourcecode von einem der beiden Klassen zu modifizieren?

Ich war mit Typeconverter experimentiert, aber scheint nicht zu funktionieren:

Guid g = new Guid();
TypeConverter tc = TypeDescriptor.GetConverter(typeof(Guid));
byte[] b2 = (byte[])tc.ConvertTo(g, typeof(byte[])); // throws exception

Die Variable tc wird auf System.ComponentModel.GuidConverter gesetzt, die nicht Konvertierungen unterstützt byte []. Kann ich zwei Typeconverter für die gleiche Klasse? Selbst wenn ich könnte, würde ich nicht brauchen ein Attribut auf den Quellcode der Klasse voranstellen eine Typeconverter zuweisen?

Danke

War es hilfreich?

Lösung

Sie können die registrierten TypeConverter für etwas ändern TypeDescriptor.AddAttributes verwendet wird; das ist nicht ganz dasselbe wie Convert.ChangeType, aber es kann genügen:

using System;
using System.ComponentModel;
static class Program
{
    static void Main()
    {
        TypeDescriptor.AddAttributes(typeof(Guid), new TypeConverterAttribute(
            typeof(MyGuidConverter)));

        Guid guid = Guid.NewGuid();
        TypeConverter conv = TypeDescriptor.GetConverter(guid);
        byte[] data = (byte[])conv.ConvertTo(guid, typeof(byte[]));
        Guid newGuid = (Guid)conv.ConvertFrom(data);
    }
}

class MyGuidConverter : GuidConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(byte[]) || base.CanConvertFrom(context, sourceType);
    }
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        return destinationType == typeof(byte[]) || base.CanConvertTo(context, destinationType);
    }
    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value != null && value is byte[])
        {
            return new Guid((byte[])value);
        }
        return base.ConvertFrom(context, culture, value);
    }
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(byte[]))
        {
            return ((Guid)value).ToByteArray();
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

Andere Tipps

System.ComponentModel.ICustomTypeDescriptor

Ja, es ist möglich. Lesen Sie die Dokumentation auf MSDN zu verwandten Informationen zu ‚injizieren‘, dass in das laufende Programm. (TypeDescriptor stellt das Verfahren IIRC).

Wenn der Code, der die Konvertierung ausführt TypeConverters unterstützt Sie TypeConverterAttribute an einer Montageebene verwenden können.

Leider nein Sie können nicht -. Sie könnte eine Erweiterungsmethode schreiben, würde erscheinen eine Umwandlung zwischen zwei Arten als Teil des Rahmens sein

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top