Здравствуйте, Serginio1, Вы писали:
S> Почему же, делегат как раз имеет списочную структуру типа TMethod. А вот как выдернуть ссылку на дедушкин метод это другая проблема. Если это не абстрактный класс или через неабстрактного наследника не перекрывающего этот метод адрес выдернуть метода выдернуть можно просто создав объект этого типа создать делегат с его методом и заменить ссылку на объект на this.
Чистой воды хак. К тому же со многими "если". Я имел ввиду стандартные("цивилизованные") средства.
Замечу, что такого рода действия могут очень огорчить GC.
Здравствуйте, Dax, Вы писали:
Dax>Здравствуйте, Serginio1, Вы писали:
S>> Почему же, делегат как раз имеет списочную структуру типа TMethod. А вот как выдернуть ссылку на дедушкин метод это другая проблема. Если это не абстрактный класс или через неабстрактного наследника не перекрывающего этот метод адрес выдернуть метода выдернуть можно просто создав объект этого типа создать делегат с его методом и заменить ссылку на объект на this.
Dax>Чистой воды хак. К тому же со многими "если". Я имел ввиду стандартные("цивилизованные") средства. Dax>Замечу, что такого рода действия могут очень огорчить GC.
Ну а что же остается делать. В Паскале и не на такое идут. А GC только дедушкин объект и не найдет.
Интересно а каким образом он огорчается???
и солнце б утром не вставало, когда бы не было меня
S> Ну а что же остается делать. В Паскале и не на такое идут. А GC только дедушкин объект и не найдет.
Дык из Паскаля из "нетакого" еще и сухим выйти можно. А тут у managed-делегата на _target memcopy предлагается.
private RuntimeMethodInfo _method;
private IntPtr _methodPtr;
private IntPtr _methodPtrAux;
private object _target; //- он самый
S>Интересно а каким образом он огорчается???
У него проблемы с памятью начинаются, в прямом смыле — жуткий склероз
А потом, плачет наверное, тихенько-тихенько
оно read-only. поэтому через делегат это провернуть не получится. только если в unsafe поменять напрямую в памяти указатели. только грязными хаками можно это сделать.
Здравствуйте, Dax, Вы писали:
S>> Ну а что же остается делать. В Паскале и не на такое идут. А GC только дедушкин объект и не найдет.
Dax>Дык из Паскаля из "нетакого" еще и сухим выйти можно. А тут у managed-делегата на _target memcopy предлагается.
Dax>
Dax>private RuntimeMethodInfo _method;
Dax>private IntPtr _methodPtr;
Dax>private IntPtr _methodPtrAux;
Dax>private object _target; //- он самый
Dax>
S>>Интересно а каким образом он огорчается??? Dax>У него проблемы с памятью начинаются, в прямом смыле — жуткий склероз Dax>А потом, плачет наверное, тихенько-тихенько
Сейчас уже не помню, но к _target напрямую обращались (сейчас Нет под рукой Net), но можно и через рефлексию его установить, тогда думаю GC будет веселее.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Алексей Одинцов, Вы писали:
АО>object Target { get; }
АО>оно read-only. поэтому через делегат это провернуть не получится. только если в unsafe поменять напрямую в памяти указатели. только грязными хаками можно это сделать.
А через отображение через FldInfo ????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Dax, Вы писали:
Y_M>>IMO не будет с CG ничего страшного. При слудующей сборке мусора он наверное просто не найдёт ссылку на подменённый объект и его убъёт из кучи
Dax>Угу, а
Dax>
Здравствуйте, Алексей Одинцов, Вы писали:
АО>Здравствуйте, Serginio1, Вы писали:
S>> А через отображение через FldInfo ????
АО>а кто вам его даст?
А разве нет такого флага BindingFlags.Private ????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Алексей Одинцов, Вы писали:
АО>Здравствуйте, Serginio1, Вы писали:
S>> А через отображение через FldInfo ????
АО>а кто вам его даст?
Можно вообще эту проблему через отображение решить
mi=ТипДедушки.GetMethod("SomeMethod",BindingFlags.Protected | BindingFlags.Instance);
mi.Invoke(this,new object[]);
Просто через делегаты быстрее если ее часто использовать http://www.rsdn.ru/Forum/?mid=395620
S>Можно вообще эту проблему через отображение решить
S>mi=ТипДедушки.GetMethod("SomeMethod",BindingFlags.Protected | BindingFlags.Instance); S> mi.Invoke(this,new object[]); S> Просто через делегаты быстрее если ее часто использовать
Опять мимо.
В этом случае вызовется свой метод, а не деда. (к слову, нет такого BindingFlags.Protected есть BindingFlags.NonPublic)
Здравствуйте, Dax, Вы писали:
S>>Можно вообще эту проблему через отображение решить
S>>mi=ТипДедушки.GetMethod("SomeMethod",BindingFlags.Protected | BindingFlags.Instance); S>> mi.Invoke(this,new object[]); S>> Просто через делегаты быстрее если ее часто использовать
Dax>Опять мимо. Dax>В этом случае вызовется свой метод, а не деда. (к слову, нет такого BindingFlags.Protected есть BindingFlags.NonPublic)
А как через установку _target челез филдИнфо ????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Dax, Вы писали:
S>>Можно вообще эту проблему через отображение решить
S>>mi=ТипДедушки.GetMethod("SomeMethod",BindingFlags.Protected | BindingFlags.Instance); S>> mi.Invoke(this,new object[]); S>> Просто через делегаты быстрее если ее часто использовать
Dax>Опять мимо. Dax>В этом случае вызовется свой метод, а не деда. (к слову, нет такого BindingFlags.Protected есть BindingFlags.NonPublic)
Считаешь, что mi вернет не прямой адрес, а ссылку на VMT ????
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> Считаешь, что mi вернет не прямой адрес, а ссылку на VMT ????
Естественно, метод же виртуальный.
С FieldInfo тоже облом — не отдает .NET fieldInfo на _target.
Я ж говорю: по честному никак не получится, а хак, он и в Африке на следующей версии .NET прекратит работу.