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