Почему этот TypeConverter не работает?

Я пытаюсь понять, почему приведенный ниже код не работает должным образом; TypeDescriptor просто не выбирает пользовательский конвертер из атрибутов. Я могу только предположить, что допустил очевидную ошибку, но не вижу ее.

- edit - этот код, кажется, работает, когда я запускаю его в консоли самостоятельно, на самом деле я вызываю конвертер изнутри гораздо более сложное приложение и из другого пространства имен.

- edit - альтернативно любые предложения о том, как я могу отладить TypeDescriptor, чтобы я мог видеть, что происходит, и тогда я, вероятно, смогу ответить на это сам.

- edit - эта проблема почти наверняка связана с деталями, находящимися в разных сборках.

- edit - похоже, это не работает из-за некоторой особенности динамической загрузки сборок - этот код выполняется под плагиноподобной архитектурой.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.ComponentModel;

namespace MyTest
{

    public class TestTester
    {
        public static void Main(string[] args)
        {
            object v = TypeDescriptor.GetConverter(typeof(MyTest.Test)).ConvertFromInvariantString("Test");
        }
    }

    public class TestConverter : TypeConverter
    {

        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return false;
        }

        public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType)
        {
            if (sourceType == typeof(string) || base.CanConvertFrom(context, sourceType))
            {
                return true;
            }
            return base.CanConvertFrom(context, sourceType);
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(Test) || base.CanConvertTo(destinationType))
            {
                return true;
            }
            return base.CanConvertTo(context, destinationType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            if (value.GetType() == typeof(string))
            {
                Test t = new Test();
                t.TestMember = value as string;
                return t;
            }
            return base.ConvertFrom(context, culture, value);
        }

        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string) && value.GetType() == typeof(Test))
            {
                return ((Test)value).TestMember;
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }

    }

    [TypeConverterAttribute(typeof(TestConverter))]
    public struct Test
    {
        public string TestMember { get; set; }
    }
}
13
задан MatthewMartin 10 October 2014 в 14:05
поделиться

1 ответ

Я видел случаи, когда я не мог получить атрибуты внутренних полей из других сборок. Не уверен, была ли это ошибка .NET или она была исправлена.

Единственное, что я могу предположить, это то, что в сложном сценарии у вас может не быть разрешения на рефлексию.

1
ответ дан 1 December 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: