Более красивый по сравнению с вытаскиванием get_Caption?
Возможно, такого способа и нет. Binder в данном случае не поможет.
Вообще ИМХО не самое логичное поведение, разумнее было бы вести себя так при установленном флаге DeclaredOnly.
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, OraStarter, Вы писали:
OS>>Гуру пришел с sql.ru (http://sql.ru/forum/actualthread.aspx?tid=672524) OS>>может подскажете более красивый способ? OS>>Спасибо
Ovl>рефлекшион обязателен? нельзя статикой обойтись?
Нет, это я как пример ошибки показал. У меня класс работает с неизвестным обьектом...
Здравствуйте, OraStarter, Вы писали:
Ovl>>рефлекшион обязателен? нельзя статикой обойтись?
OS>Нет, это я как пример ошибки показал. У меня класс работает с неизвестным обьектом...
Ну если надо просто задачу решить, то можно и просто в лоб:
Type t = myproperty2.GetType();
PropertyInfo propertyInfo = null;
while (t != null)
{
propertyInfo = t.GetProperty("Caption");
if (propertyInfo != null && propertyInfo.CanRead)
break;
t = t.BaseType;
}
Хотя, конечно, грустное поведение какое-то у GetProperty.
Здравствуйте, Воронков Василий, Вы писали:
OS>>Спасибо, интересны вариант ВВ>Ага, интересный. Вместо того, чтобы один раз вызвать метод с высокими накладными расходами будем дергать его несколько раз.
А это уже зависит от задачи. Может автору совсем не надо в цикле сто тысяч раз читать значение свойства, не правда ли?
Здравствуйте, MozgC, Вы писали:
OS>>>Спасибо, интересны вариант ВВ>>Ага, интересный. Вместо того, чтобы один раз вызвать метод с высокими накладными расходами будем дергать его несколько раз. MC>А это уже зависит от задачи. Может автору совсем не надо в цикле сто тысяч раз читать значение свойства, не правда ли?
Ну как бы недостатки очевидны, а польза? Вот вы видите в проекте код.
Вариант 1:
Type t = myproperty2.GetType();
PropertyInfo propertyInfo = null;
while (t != null)
{
propertyInfo = t.GetProperty("Caption");
if (propertyInfo != null && propertyInfo.CanRead)
break;
t = t.BaseType;
}
Вариант 2:
Type t = myproperty2.GetType();
var mi = t.GetMethod("get_Caption");
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ну как бы недостатки очевидны, а польза? Вот вы видите в проекте код. ВВ>Какой понять легче?
Лично я бы использовал "get_Caption" и не заморачивался Просто человек привел альтернативное решение, что на мой взгляд в любом случае достойно уважения
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ну как бы недостатки очевидны, а польза? Вот вы видите в проекте код. ВВ>Вариант 1:
ВВ>Вариант 2:
ВВ>Какой понять легче?
Как бы да. Второй конечно легче. Но если первый оформить в виде процедуры, а в комментарии написать причину такого варианта, то он тоже вполне понятный. Хотя оба варианта кривенькие. А ровный почему-то майкрософт не предусмотрел.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ну тогда весь код на МС++ некорректен, где пишут obj->get_Caption(), и все это дело еще как-то компилируется.
Ты не веришь в то, что геттер может называться по другому?
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Ты не веришь в то, что геттер может называться по другому?
Не верю. Т.к. если выйдет такое "обновление", то весь существующий код на фиг отвалится. Пример с МС++ я уже привел, где все эти кишки наружу торчат. Но ладно, МС++ немодный сейчас. Ну и так и компятор C# какое-нибудь
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Не верю.
Зря. Вот тебе пример.
var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("asm"), AssemblyBuilderAccess.Run);
var mdl = asm.DefineDynamicModule("main");
var type = mdl.DefineType("MyType");
var getter =
type.DefineMethod(
"gEt-PrOp",
MethodAttributes.Public | MethodAttributes.SpecialName,
typeof (int),
new Type[0]);
var gen = getter.GetILGenerator();
gen.Emit(OpCodes.Ldc_I4_3);
gen.Emit(OpCodes.Ret);
var prop =
type.DefineProperty(
"Prop",
PropertyAttributes.None,
typeof (string),
new Type[0]);
prop.SetGetMethod(getter);
var createdType = type.CreateType();
var propInfo = createdType.GetProperty("Prop");
Console.WriteLine(propInfo.GetValue(Activator.CreateInstance(createdType), null));
Console.WriteLine(createdType.GetMethod("get_Prop") != null);
ВВ> Т.к. если выйдет такое "обновление", то весь существующий код на фиг отвалится. ВВ>obj.Property = "value"; ВВ>транслирует в ВВ>call instance set_Property
Компилятор шарпа и компилятор МС++ читают метаданные и используют токены реальных методов, а не тупо формируют строчку конкатенацией, так что работать они будут нормально.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Компилятор шарпа и компилятор МС++ читают метаданные и используют токены реальных методов, а не тупо формируют строчку конкатенацией, так что работать они будут нормально.
Да, тем не менее в итоге-таки получается строчка, которая выглядит как "get_Caption". Разве нет?
Вот представим, выходит дотнет 4.0. Там метод стандартной библиотеки называется уже не get_Caption, а __get_Caption, ну неважно как. Вопрос: что произойдет с моим уже откомпилированным кодом?
У меня вот складывается впечатление, что наименования методов для свойств в стиле get_XXX и set_XXX — это уже стандарт дефакто.
ЗЫ.
Кстати, а что ты думаешь касательно затронутого в теме вопроса? Что существующая реализация RuntimeType.GetProperty с флажками Instance|Public не возвращает в данном случае информацию о сеттере свойства? Это логичное поведение или нет? Мне показалось, что похоже на бажок.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Да, тем не менее в итоге-таки получается строчка, которая выглядит как "get_Caption". Разве нет?
Брр, чушь какую-то написал. Получается, конечно, не "строка", но прямой вызов метода, имеющего название get_Caption. Типа такого:
call instance void Test::get_Caption(string)
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Да, тем не менее в итоге-таки получается строчка, которая выглядит как "get_Caption". Разве нет?
Я тебе, кажется, наглядно продемонстрировал, что вместо get_Caption там легко может быть VoronkovSpecialFoo. И все будет работать.
ВВ>Вот представим, выходит дотнет 4.0. Там метод стандартной библиотеки называется уже не get_Caption, а __get_Caption, ну неважно как. Вопрос: что произойдет с моим уже откомпилированным кодом?
Перестанет работать.
ВВ>У меня вот складывается впечатление, что наименования методов для свойств в стиле get_XXX и set_XXX — это уже стандарт дефакто.
Нет никаких оснований на это рассчитывать.
ВВ>Кстати, а что ты думаешь касательно затронутого в теме вопроса? Что существующая реализация RuntimeType.GetProperty с флажками Instance|Public не возвращает в данном случае информацию о сеттере свойства? Это логичное поведение или нет?
ИМХО не очень.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
Здравствуйте, AndrewVK, Вы писали:
ВВ>>Да, тем не менее в итоге-таки получается строчка, которая выглядит как "get_Caption". Разве нет? AVK>Я тебе, кажется, наглядно продемонстрировал, что вместо get_Caption там легко может быть VoronkovSpecialFoo. И все будет работать.
Я с этим и не спорю.
ВВ>>Вот представим, выходит дотнет 4.0. Там метод стандартной библиотеки называется уже не get_Caption, а __get_Caption, ну неважно как. Вопрос: что произойдет с моим уже откомпилированным кодом? AVK>Перестанет работать.
И как раз по этой причине я и не верю, что переименуют названия методов для свойств.
ВВ>>У меня вот складывается впечатление, что наименования методов для свойств в стиле get_XXX и set_XXX — это уже стандарт дефакто. AVK>Нет никаких оснований на это рассчитывать.
Ну смотри, вот сейчас, предположим, у меня в проекте есть "грязный хак", который получает значение свойства через "get_Caption".
Какая проблема у этого кода? Очень простая — если в будущей версии дотнета именование методов для свойств изменятся, то этот код перестанет работать. Но подождите, ведь если будут сделаны такие изменения в новой версии дотнета, то весь мой код по-любому перестанет под ней работать
ВВ>>Кстати, а что ты думаешь касательно затронутого в теме вопроса? Что существующая реализация RuntimeType.GetProperty с флажками Instance|Public не возвращает в данном случае информацию о сеттере свойства? Это логичное поведение или нет? AVK>ИМХО не очень.