Я пытаюсь понять, почему приведенный ниже код работает не так, как ожидалось; TypeDescriptor
просто не подбирает пользовательский конвертер из атрибутов. Я могу только предположить, что совершил явную ошибку, но я не вижу этого.
- 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; }
}
}