для свойства я нашел зацепку — TypeDescriptor.GetProperties(.. а потом TypeDescriptor.GetConverter(..
Но как быть с полем класса? как для него получить тот TypeConverter который указан в атрибуте?
Re: Как получить экземпляр TypeConverter указанный в атрибут
Здравствуйте, WareZzhKa, Вы писали:
WZK>как мне получить экземпляр TypeConverter, указанный в атрибуте для поля или свойства класса:
… WZK>Как мне получить TypeConverter converter = экземпляр TypeConverter для "_a" и для "a"
Зачем? TypeConverter используется для работы с "компонентами", и то, как они устроены в языке (свойства, поля, что-то ещё) не важно. "Снаружи" надо всегда использовать "TypeDescriptor.GetProperties(.. а потом TypeDescriptor.GetConverter(..". И что бы получить конвертер для поля "_a" в вашем классе: [c#]
class A
{
[TypeConverter(EnumConverter1)]
private int _a;
[TypeConverter(EnumConverter2)]
a
{
get { return _a; }
set { _a = value; }
}
}
[/c#]
необходимо сделать так, что бы это поле было представлено соответствующим PropertyDescriptor в компонентной моделе класса.
Для этого есть несколько способов: например, можно определить для класса TypeConverter, в котором переопределить GetProperties (и GetPropertiesSupported).
Совсем другой, "кривой" способ — рефлекшен:
var field = typeof(A).GetField("_a", BindingFlags.Instance | BindingFlags.NonPublic);
var attr = (TypeConverterAttribute)Attribute.GetCustomAttribute(field, typeof(TypeConverterAttribute));
if(attr != null) {
var converter = Activator.CreateInstance(Type.GetType(attr.ConverterTypeName));
}//if
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Как получить экземпляр TypeConverter указанный в атри
Огромное спасибо за ответы. вобщем-то думал — реально просто самому получать тип конвертора из TypeConverterAttribute — но встает вопрос: создания самого конвертера:
Код будет вывалить эксепшены — ведь некоторые конвертеры не имеют конструктор без параметров (например, EnumTypeConverter)! Мне вот поэтому и интересно как разрулить систуацию. Пытался прогами рефлекторами посмотреть как же получает конвертер метод GetConverter. чето — не получилось это сделать((( Или GetConverter ищет сначала конструктор без параметров, а потом конструктор с 1 параметром Type?
Re[4]: Как получить экземпляр TypeConverter указанный в атри
Здравствуйте, WareZzhKa, Вы писали:
WZK>Код будет вывалить эксепшены — ведь некоторые конвертеры не имеют конструктор без параметров (например, EnumTypeConverter)! Мне вот поэтому и интересно как разрулить систуацию. Пытался прогами рефлекторами посмотреть как же получает конвертер метод GetConverter. чето — не получилось это сделать((( Или GetConverter ищет сначала конструктор без параметров, а потом конструктор с 1 параметром Type?
При создании TypeConverter-а сначала ищется [открытый] конструктор с одним параметром типа Type. Если такого конструктора не оказалось, вызывается конструктор без параметров. За подробностями — в ReflectTypeDescriptionProvider. Впрочем, никто не мешает сделать свой ITypeDescriptionProvider под свои нужды.
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Как получить экземпляр TypeConverter указанный в атри
Здравствуйте, _FRED_, Вы писали:
_FR>За подробностями — в ReflectTypeDescriptionProvider.
Так как речь о конвертере не на типе, а на свойстве, то он создаётся в PropertyDescriptor-е. По тому же алгоритму: или через конструктор с типом, или через конструктор без параметров.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Как получить экземпляр TypeConverter указанный в атри
Здравствуйте, WareZzhKa, Вы писали:
WZK>Огромное спасибо за ответы. вобщем-то думал — реально просто самому получать тип конвертора из TypeConverterAttribute — но встает вопрос: создания самого конвертера: WZK>