Re[16]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 16.06.09 21:51
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>>>Вот представим, выходит дотнет 4.0. Там метод стандартной библиотеки называется уже не get_Caption, а __get_Caption, ну неважно как. Вопрос: что произойдет с моим уже откомпилированным кодом?

AVK>>Перестанет работать.

ВВ>И как раз по этой причине я и не верю


Это не вопрос веры.

AVK>>Нет никаких оснований на это рассчитывать.


ВВ>Ну смотри, вот сейчас, предположим, у меня в проекте есть "грязный хак", который получает значение свойства через "get_Caption".

ВВ>Какая проблема у этого кода? Очень простая — если в будущей версии дотнета именование методов для свойств изменятся, то этот код перестанет работать.

При чем тут дотнет? Еще раз — рантайм не накладывает никаких ограничений на имена геттеров и сеттеров. Все целиком лежит на совести компилятора. Поэтому уже сейчас на такое можно натолкнуться легко — какой нибудь компилятор, отличный от МСных, динамически генерируемые сборки, сборки, обработанные обфускаторами и т.п.

ВВ> Но подождите, ведь если будут сделаны такие изменения в новой версии дотнета


Для этого не нужна новая версия дотнета, я тебе это наглядно продемонстрировал.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[17]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 16.06.09 22:10
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>При чем тут дотнет? Еще раз — рантайм не накладывает никаких ограничений на имена геттеров и сеттеров. Все целиком лежит на совести компилятора. Поэтому уже сейчас на такое можно натолкнуться легко — какой нибудь компилятор, отличный от МСных, динамически генерируемые сборки, сборки, обработанные обфускаторами и т.п.


Я тебе объяснил, почему я считаю, что конвенция для именования таких методов не будет изменена. Потому что просто напросто весь существующий код отвалится. И это факт. Потому что компилятор раскрывает обращения к св-вам в вызовы методов. А это означает, что код t.GetMethod("get_Caption") несет в себе не больше проблем, чем s = Caption. На мой взгляд — это достаточно серьезная причина, чтобы ничего не менять.
С чем ты споришь — мне непонятно
Re[18]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.06.09 07:14
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Я тебе объяснил, почему я считаю, что конвенция для именования таких методов не будет изменена. Потому что просто напросто весь существующий код отвалится.


Во-первых никакой конвенции нет, во-вторых существующие конечно менять не будут, а вот сборки, собранные другими компиляторами на практике могут попасться легко.

ВВ>С чем ты споришь — мне непонятно


С тем, что приведенный код — корректен.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[19]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 17.06.09 08:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Во-первых никакой конвенции нет, во-вторых существующие конечно менять не будут, а вот сборки, собранные другими компиляторами на практике могут попасться легко.


Т.е. твой аргумент звучит как — а если бы все это было написано на Эрланге, то не работало бы?

ВВ>>С чем ты споришь — мне непонятно

AVK>С тем, что приведенный код — корректен.

Тогда мне непонятен критерий "корректности". Речь идет по сути о "хаке", призванном обойти весьма странное ограничение. Решение с GetMethod("get_Property"), если оно у тебя заработало, то будет работать всегда, и данный код на мой взгляд никакой дополнительной угрозы в себе не несет.
Это очень хорошо, что ты написал, что методы для свойств могут быть названы как угодно, но если они уже названы как get_XXX, set_XXX, то никто их менять не будет.
Re[20]: GetGetMethod не найден...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 17.06.09 08:50
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Тогда мне непонятен критерий "корректности". Речь идет по сути о "хаке", призванном обойти весьма странное ограничение. Решение с GetMethod("get_Property"), если оно у тебя заработало, то будет работать всегда, и данный код на мой взгляд никакой дополнительной угрозы в себе не несет.

Если оно заработало, то может не сработать например с генеренными emit-ом свойствами.

ВВ>Это очень хорошо, что ты написал, что методы для свойств могут быть названы как угодно, но если они уже названы как get_XXX, set_XXX, то никто их менять не будет.

Те что названы, может и не будут менять. Но кто даст гарантию?
А те что написаны не "get_XXX", а gef_xxx"? Мало ли, описался человек?
Re[21]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 17.06.09 08:57
Оценка:
Здравствуйте, samius, Вы писали:

ВВ>>Тогда мне непонятен критерий "корректности". Речь идет по сути о "хаке", призванном обойти весьма странное ограничение. Решение с GetMethod("get_Property"), если оно у тебя заработало, то будет работать всегда, и данный код на мой взгляд никакой дополнительной угрозы в себе не несет.

S>Если оно заработало, то может не сработать например с генеренными emit-ом свойствами.

Это как это? Оно или заработало или нет. Но тогда оно не сработает сразу, но ты все равно не получишь бомбу "замедленного действия".
Мне кажется, что мы обсуждали вызов конкретного свойства, а не разработку универсальной библиотеки для вызова любых свойств через рефлекшин.

ВВ>>Это очень хорошо, что ты написал, что методы для свойств могут быть названы как угодно, но если они уже названы как get_XXX, set_XXX, то никто их менять не будет.

S>Те что названы, может и не будут менять. Но кто даст гарантию?
S>А те что написаны не "get_XXX", а gef_xxx"? Мало ли, описался человек?

Читаем что я написал, еще раз:

методы для свойств могут быть названы как угодно, но если они уже названы как get_XXX, set_XXX, то никто их менять не будет.

Это утверждение верное.
Народ, вы поймите, что обращение к публичному свойству через get_XXX в данном случае полностью аналогично обращению к любому другому публичному методу через рефлекшин. Я приводил пример с МС++, где данная деталь реализации вообще никак не скрыта. Потому что:
— Метод можно назвать как угодно. Хоть SamiusSuperFoo
— Теоретически название метода может поменяться
Re[22]: GetGetMethod не найден...
От: samius Япония http://sams-tricks.blogspot.com
Дата: 17.06.09 09:06
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Мне кажется, что мы обсуждали вызов конкретного свойства, а не разработку универсальной библиотеки для вызова любых свойств через рефлекшин.

Разве? Ну ладно. Но даже в этом случае я бы не стал расчитывать что имя GetMethod-а свойства не изменится когда-нибудь.

ВВ>>>Это очень хорошо, что ты написал, что методы для свойств могут быть названы как угодно, но если они уже названы как get_XXX, set_XXX, то никто их менять не будет.

S>>Те что названы, может и не будут менять. Но кто даст гарантию?
S>>А те что написаны не "get_XXX", а gef_xxx"? Мало ли, описался человек?

ВВ>Читаем что я написал, еще раз:


ВВ>методы для свойств могут быть названы как угодно, но если они уже названы как get_XXX, set_XXX, то никто их менять не будет.

Вообще-то названия этих методов явно не указываются, а шлепает их компилятор. Вот перепишут MS компилятор шарпа и будут все GetMethod-ы называться "gXXX"! Скорее всего это не произойдет, но все же.

GetGetMethod отвечает за выдачу связанного со свойством метода, как бы он не назывался. Потому предпочтительнее.
Re[20]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.06.09 10:39
Оценка: +1
Здравствуйте, Воронков Василий, Вы писали:

AVK>>С тем, что приведенный код — корректен.


ВВ>Тогда мне непонятен критерий "корректности".


Критерий очень простой — если код не работает в ряде случаев, значит он неполностью корректен.

ВВ> Речь идет по сути о "хаке", призванном обойти весьма странное ограничение. Решение с GetMethod("get_Property"), если оно у тебя заработало, то будет работать всегда


Нет, всегда оно работать не будет. Ты же, надеюсь, понимаешь, что константа на конкретное свойство — это только пример и в реальном коде имена свойств будут браться из реальных произвольных типов, а не будут захардкожены?

ВВ>Это очень хорошо, что ты написал, что методы для свойств могут быть названы как угодно, но если они уже названы как get_XXX, set_XXX, то никто их менять не будет.


А кто тебе сказал, что автору нужен код, который будет работать исключительно со строго заданным и заранее известным набором свойств? Если это так, зачем там вообще рефлекшен тогда?
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[22]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.06.09 10:39
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Мне кажется, что мы обсуждали вызов конкретного свойства, а не разработку универсальной библиотеки для вызова любых свойств через рефлекшин.


А тебе, случаем, не кажется, что вызов конкретного свойства через рефлекшен — безумие?
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[23]: GetGetMethod не найден...
От: MozgC США http://nightcoder.livejournal.com
Дата: 17.06.09 11:31
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>А тебе, случаем, не кажется, что вызов конкретного свойства через рефлекшен — безумие?


Лично мне не кажется. Автор же написал что у него класс работает с заранее неизвестным объектом. А еще может модификаторы доступа на тех классах мешают обратиться к свойствам или может в рантайме создаются типы и надо к их свойствам обращаться.
Re[24]: GetGetMethod не найден...
От: OraStarter  
Дата: 17.06.09 12:50
Оценка:
Здравствуйте, MozgC, Вы писали:
MC>Лично мне не кажется. Автор же написал что у него класс работает с заранее неизвестным объектом. А еще может модификаторы доступа на тех классах мешают обратиться к свойствам или может в рантайме создаются типы и надо к их свойствам обращаться.

Все верно. Я не знаю какие будут св-ва у экземпляра. Пример я привел, только чтобы показать ошибку не более того. А вообще я пишу дизайнер со своим ObjectInspector-ом в вебе поэтому и работаю через рефлексию. По ошибке: создал на мс коннекте ченжреквест, может пофиксят, а может пошлют
Всем еще раз спасибо. Не шуточная борьба завязалась. Интересно почитать
Re[23]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 17.06.09 13:03
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>А тебе, случаем, не кажется, что вызов конкретного свойства через рефлекшен — безумие?


Если свойство — internal, или же нам нужно вызвать его реализацию в супер-базовом классе, что шарп явно сделать не позволяет, то нет, не безумие.
А тебе не кажется, что обсуждаемая здесь проблема не столь уж и часто встречается на практике? Я, к примеру, за все время ни разу с подобным поведением не сталкивался.
Re[21]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 17.06.09 13:21
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Нет, всегда оно работать не будет. Ты же, надеюсь, понимаешь, что константа на конкретное свойство — это только пример и в реальном коде имена свойств будут браться из реальных произвольных типов, а не будут захардкожены?


Не, ну говорили-то мы о примере. Никакая конкретная задача здесь не обсуждается. В реальном коде будет и задача другая и решение, возможно, тоже.

ВВ>>Это очень хорошо, что ты написал, что методы для свойств могут быть названы как угодно, но если они уже названы как get_XXX, set_XXX, то никто их менять не будет.


AVK>А кто тебе сказал, что автору нужен код, который будет работать исключительно со строго заданным и заранее известным набором свойств?


А что нужно автору? Я вот не знаю
Знаю только, что у описанной здесь проблемы однозначно красивого решения нет. То, что здесь предложили с базовым клаccом потенциально несет в себе другие проблемы — и придется писать кучу кода, чтобы их обойти.
Вот, к примеру, в наш код передали класс, который перекрывает один из методов виртуального св-ва и изменяет логику. Очевидно это сделано для изменения поведения свойства. Изменим немножко код по ссылке:

using System;
using System.Reflection;
using System.Linq;
using System.Diagnostics;

public class Myproperty1
{
    private string caption = "A Default caption";
    public virtual string Caption {
        get {
            return "This is not a caption";
        }
        set {
            if (caption != value) {
                caption = value;
            }
        }
    }
}

public class Myproperty2 : Myproperty1
{
    private string caption2 = "A Default caption";
    public override string Caption {
        set {
            if (caption2 != value) {
                caption2 = value;
            }
        }
    }
}

namespace ConsoleApplication7
{
    class Program
    {
        public static void Main() 
        {
            Myproperty2 myproperty2 = new Myproperty2();        
            var type = myproperty2.GetType();            
            var pi = type.BaseType.GetProperty("Caption");            
            var res = pi.GetValue(myproperty2, null);            
            Console.WriteLine(res);            
        
        }
    }
}


Вывод:

> "C:\temp\bin\GetGetMethod_bug.exe" 
This is not a caption
> Process Exit Code: 0
> Time Taken: 00:00


Т.е. этот вариант изначально некорректно работает Придется усложнять логику, держать два варианта проперти-инфо для вызова или как-то так и так далее.
Если у тебя есть альтернативное решение — предлагай. А то критиковать-то все могут

AVK>Если это так, зачем там вообще рефлекшен тогда?


Ну я вполне могу представить зачем нужен рефлекшин в таком случае. По крайней мере пример из реальной жизни придумать вполне можно
Re[24]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.06.09 13:28
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Если свойство — internal, или же нам нужно вызвать его реализацию в супер-базовом классе, что шарп явно сделать не позволяет, то нет, не безумие.


Автор достаточно ясно выразился, чтобы ты продолжал фантазировать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[22]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.06.09 17:25
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Не, ну говорили-то мы о примере.


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

AVK>>А кто тебе сказал, что автору нужен код, который будет работать исключительно со строго заданным и заранее известным набором свойств?


ВВ>А что нужно автору? Я вот не знаю


Так спроси. Впрочем, он уже ответил.

ВВ>Знаю только, что у описанной здесь проблемы однозначно красивого решения нет. То, что здесь предложили с базовым клаccом потенциально несет в себе другие проблемы — и придется писать кучу кода, чтобы их обойти.


Лучше некрасивый и корректно работающий код, нежели некрасивый и работающий некорректно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[25]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.06.09 17:47
Оценка: 6 (1) +1
Здравствуйте, OraStarter, Вы писали:

OS>Все верно. Я не знаю какие будут св-ва у экземпляра. Пример я привел, только чтобы показать ошибку не более того. А вообще я пишу дизайнер со своим ObjectInspector-ом в вебе поэтому и работаю через рефлексию.


О, вот прекрасный пример, почему надо правильно задавать вопросы. Если тебе для дизайнера, то ты полез не в ту степь. Для дизайнера надо не рефлекшеном пользоваться, а стандартной компонентной моделью. Соотв., в твоем примере можно сделать так:
var comp = new Myproperty2();
Console.WriteLine(TypeDescriptor.GetProperties(comp)[0].GetValue(comp));


P.S. На будущее — http://rsdn.ru/Info/Howtoask.xml
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[26]: GetGetMethod не найден...
От: Аноним  
Дата: 18.06.09 08:55
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>О, вот прекрасный пример, почему надо правильно задавать вопросы. Если тебе для дизайнера, то ты полез не в ту степь. Для дизайнера надо не рефлекшеном пользоваться, а стандартной компонентной моделью. Соотв., в твоем примере можно сделать так:

AVK>
AVK>var comp = new Myproperty2();
AVK>Console.WriteLine(TypeDescriptor.GetProperties(comp)[0].GetValue(comp));
AVK>


AVK>P.S. На будущее — http://rsdn.ru/Info/Howtoask.xml

Больше спасибо, сегодня попробую... А чем это отличается от рефлексии? Как при этом получаются данные?
Спасибо.
Re[27]: GetGetMethod не найден...
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.06.09 12:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Больше спасибо, сегодня попробую... А чем это отличается от рефлексии?


Уровень абстракции выше.

А> Как при этом получаются данные?


В основном конечно с помощью рефлексии, но там много всяких дополнительных моментов — специальные атрибуты, TypeConverter, ICustomTypeDescriptor и т.п.
... << RSDN@Home 1.2.0 alpha 4 rev. 1227 on Windows Vista 6.1.7100.0>>
AVK Blog
Re[18]: GetGetMethod не найден...
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.06.09 06:49
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

В Delphi по умолчанию гетеры и сетеры Get_ и Set_, кроме того вроде как можно любой метод подставить
например этот геттер
property ActiveDocument: IVDocument read ЛюбоеИмяМетода; //Get_ActiveDocument


Правда не уверен. Но нужно расматривать гетеры и сетеры с позиций других языков.
Поэтому надежнее добираться через методы PropertyInfo GetGetMethod() GetSetMethod()
и солнце б утром не вставало, когда бы не было меня
Re[19]: GetGetMethod не найден...
От: Воронков Василий Россия  
Дата: 19.06.09 08:32
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Правда не уверен. Но нужно расматривать гетеры и сетеры с позиций других языков.

S>Поэтому надежнее добираться через методы PropertyInfo GetGetMethod() GetSetMethod()

Это я понимаю. Тут речь идет о том, что в МСИЛе нет такой специальной команды как call property. Поэтому если жизнь прижала — то нет ничего страшного в том, чтобы вызвать конкретный метод свойства напрямую. Поэтому что изменение имен методов свойств по сути равноценно изменению имени публичного метода, т.е. все клиенты по любому отваливаются.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.