GetGetMethod не найден...
От: OraStarter  
Дата: 16.06.09 10:33
Оценка: 1 (1)
Гуру пришел с sql.ru (http://sql.ru/forum/actualthread.aspx?tid=672524)
может подскажете более красивый способ?
Спасибо
Re: GetGetMethod не найден...
От: Ovl Россия  
Дата: 16.06.09 11:45
Оценка: 1 (1)
Здравствуйте, OraStarter, Вы писали:

OS>Гуру пришел с sql.ru (http://sql.ru/forum/actualthread.aspx?tid=672524)

OS>может подскажете более красивый способ?
OS>Спасибо

рефлекшион обязателен? нельзя статикой обойтись?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 16.06.09 12:45
Оценка: +1
Здравствуйте, OraStarter, Вы писали:

OS>Гуру пришел с sql.ru (http://sql.ru/forum/actualthread.aspx?tid=672524)

OS>может подскажете более красивый способ?
OS>Спасибо

Более красивый по сравнению с вытаскиванием get_Caption?
Возможно, такого способа и нет. Binder в данном случае не поможет.
Вообще ИМХО не самое логичное поведение, разумнее было бы вести себя так при установленном флаге DeclaredOnly.
Re[2]: GetGetMethod не найден...
От: OraStarter  
Дата: 16.06.09 12:49
Оценка:
Здравствуйте, Ovl, Вы писали:

Ovl>Здравствуйте, OraStarter, Вы писали:


OS>>Гуру пришел с sql.ru (http://sql.ru/forum/actualthread.aspx?tid=672524)

OS>>может подскажете более красивый способ?
OS>>Спасибо

Ovl>рефлекшион обязателен? нельзя статикой обойтись?


Нет, это я как пример ошибки показал. У меня класс работает с неизвестным обьектом...
Re[3]: GetGetMethod не найден...
От: Spiceman  
Дата: 16.06.09 13:08
Оценка: 6 (1)
Здравствуйте, 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.
Re[4]: GetGetMethod не найден...
От: OraStarter  
Дата: 16.06.09 13:13
Оценка:
Здравствуйте, Spiceman, Вы писали:

S>Ну если надо просто задачу решить, то можно и просто в лоб:


S>
S>            Type t = myproperty2.GetType();
S>            PropertyInfo propertyInfo = null;
S>            while (t != null)
S>            {
S>                propertyInfo = t.GetProperty("Caption");
S>                if (propertyInfo != null && propertyInfo.CanRead)
S>                    break;
S>                t = t.BaseType;
S>            }
S>


S>Хотя, конечно, грустное поведение какое-то у GetProperty.


Спасибо, интересны вариант
Re[5]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 16.06.09 13:35
Оценка:
Здравствуйте, OraStarter, Вы писали:

OS>Спасибо, интересны вариант


Ага, интересный. Вместо того, чтобы один раз вызвать метод с высокими накладными расходами будем дергать его несколько раз.
Re[6]: GetGetMethod не найден...
От: MozgC США http://nightcoder.livejournal.com
Дата: 16.06.09 13:43
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

OS>>Спасибо, интересны вариант

ВВ>Ага, интересный. Вместо того, чтобы один раз вызвать метод с высокими накладными расходами будем дергать его несколько раз.

А это уже зависит от задачи. Может автору совсем не надо в цикле сто тысяч раз читать значение свойства, не правда ли?
Re[7]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 16.06.09 14:04
Оценка:
Здравствуйте, 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");


Какой понять легче?
Re[8]: GetGetMethod не найден...
От: MozgC США http://nightcoder.livejournal.com
Дата: 16.06.09 14:10
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну как бы недостатки очевидны, а польза? Вот вы видите в проекте код.

ВВ>Какой понять легче?

Лично я бы использовал "get_Caption" и не заморачивался Просто человек привел альтернативное решение, что на мой взгляд в любом случае достойно уважения
Re[8]: GetGetMethod не найден...
От: Spiceman  
Дата: 16.06.09 14:16
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну как бы недостатки очевидны, а польза? Вот вы видите в проекте код.

ВВ>Вариант 1:

ВВ>Вариант 2:


ВВ>Какой понять легче?


Как бы да. Второй конечно легче. Но если первый оформить в виде процедуры, а в комментарии написать причину такого варианта, то он тоже вполне понятный. Хотя оба варианта кривенькие. А ровный почему-то майкрософт не предусмотрел.
Re[8]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.06.09 18:39
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>
ВВ>Type t = myproperty2.GetType();
ВВ>var mi = t.GetMethod("get_Caption");
ВВ>


Этот вариант некорректен. Метод в общем случае может называться как угодно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[9]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 16.06.09 18:40
Оценка: :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Этот вариант некорректен. Метод в общем случае может называться как угодно.


Ну тогда весь код на МС++ некорректен, где пишут obj->get_Caption(), и все это дело еще как-то компилируется.
Re[10]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.06.09 18:57
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну тогда весь код на МС++ некорректен, где пишут obj->get_Caption(), и все это дело еще как-то компилируется.


Ты не веришь в то, что геттер может называться по другому?
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[11]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 16.06.09 19:04
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Ты не веришь в то, что геттер может называться по другому?


Не верю. Т.к. если выйдет такое "обновление", то весь существующий код на фиг отвалится. Пример с МС++ я уже привел, где все эти кишки наружу торчат. Но ладно, МС++ немодный сейчас. Ну и так и компятор C# какое-нибудь

obj.Property = "value";

транслирует в

call instance set_Property
Re[12]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.06.09 19:12
Оценка: 9 (2) +1
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Не верю.


Зря. Вот тебе пример.
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>>
AVK Blog
Re[13]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 16.06.09 19:20
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Компилятор шарпа и компилятор МС++ читают метаданные и используют токены реальных методов, а не тупо формируют строчку конкатенацией, так что работать они будут нормально.


Да, тем не менее в итоге-таки получается строчка, которая выглядит как "get_Caption". Разве нет?
Вот представим, выходит дотнет 4.0. Там метод стандартной библиотеки называется уже не get_Caption, а __get_Caption, ну неважно как. Вопрос: что произойдет с моим уже откомпилированным кодом?
У меня вот складывается впечатление, что наименования методов для свойств в стиле get_XXX и set_XXX — это уже стандарт дефакто.

ЗЫ.
Кстати, а что ты думаешь касательно затронутого в теме вопроса? Что существующая реализация RuntimeType.GetProperty с флажками Instance|Public не возвращает в данном случае информацию о сеттере свойства? Это логичное поведение или нет? Мне показалось, что похоже на бажок.
Re[14]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 16.06.09 19:27
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Да, тем не менее в итоге-таки получается строчка, которая выглядит как "get_Caption". Разве нет?


Брр, чушь какую-то написал. Получается, конечно, не "строка", но прямой вызов метода, имеющего название get_Caption. Типа такого:
call instance void Test::get_Caption(string)
Re[14]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.06.09 19:33
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Да, тем не менее в итоге-таки получается строчка, которая выглядит как "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>>
AVK Blog
Re[15]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 16.06.09 19:42
Оценка:
Здравствуйте, 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>ИМХО не очень.

Может, пожалуемся?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.