سؤال

وأود أن تنفيذ التحويل بين فئتين المكتبة من قبل Convert.ChangeType في C #. يمكنني تغيير أي من هذين النوعين. على سبيل المثال تحويل بين ارشد و[] بايت.

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

وأنا أدرك أن ارشد يوفر طريقة ToByteArray ()، ولكن أود أن يكون هذا يسمى عند تحويلها إلى ارشد البايت []. والسبب وراء ذلك هو أن تحويل كما يأخذ مكان في التعليمات البرمجية مكتبة (AseDataAdapter) وهو ما لا يمكن تعديل. فهل من الممكن تحديد قاعدة التحويل بين نوعين من دون تعديل المصدرية أي من الفئتين؟

وكنت تجريب TypeConverter، ولكن لا يبدو أن العمل إما:

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

ويحصل على تعيين ح متغير لSystem.ComponentModel.GuidConverter الذي لا يعتمد التحويلات إلى [] بايت. هل يمكنني الحصول على اثنين من TypeConverters لنفس الفئة؟ حتى إذا لم أستطع، لن أحتاج إلى إلحاقها سمة إلى شفرة المصدر من الطبقة تعيين TypeConverter؟

والشكر

هل كانت مفيدة؟

المحلول

ويمكنك تغيير TypeConverter مسجل لشيء باستخدام TypeDescriptor.AddAttributes. هذه ليست هي نفس Convert.ChangeType، ولكن قد يكون كافيا:

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

نصائح أخرى

System.ComponentModel.ICustomTypeDescriptor

نعم، فمن الممكن. قراءة الوثائق في MSDN للحصول على معلومات ذات الصلة إلى "حقن" التي في تشغيل البرنامج. (TypeDescriptor يوفر IIRC طريقة).

إذا التعليمات البرمجية التي يتم تنفيذ التحويل يدعم TypeConverters يمكنك استخدام TypeConverterAttribute على مستوى التجمع.

ولسوء الحظ لا يمكنك لا يمكن - هل يمكن أن يكتب طريقة التمديد التي من شأنها أن <م> تظهر أن يكون التحويل بين نوعين كجزء من إطار

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top