Re[6]: Неужели на C# такое не сделать???
От: Воронков Василий Россия  
Дата: 11.12.03 12:24
Оценка: -1
Ну и что? Любой код может привести к ошибкам. Даже такой:

public class A
{
protected MyType Child;
}


public class B
{
public void DoSomething()
{
Child.DoIt(); // Null reference exception
}
}

И что, из-за этого надо запрещать protected?
Posted via RSDN NNTP Server 1.8 beta
Re[4]: Неужели на C# такое не сделать???
От: Dax  
Дата: 11.12.03 12:41
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Почему же, делегат как раз имеет списочную структуру типа TMethod. А вот как выдернуть ссылку на дедушкин метод это другая проблема. Если это не абстрактный класс или через неабстрактного наследника не перекрывающего этот метод адрес выдернуть метода выдернуть можно просто создав объект этого типа создать делегат с его методом и заменить ссылку на объект на this.


Чистой воды хак. К тому же со многими "если". Я имел ввиду стандартные("цивилизованные") средства.
Замечу, что такого рода действия могут очень огорчить GC.
Re[5]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 12:48
Оценка:
Здравствуйте, Dax, Вы писали:

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


S>> Почему же, делегат как раз имеет списочную структуру типа TMethod. А вот как выдернуть ссылку на дедушкин метод это другая проблема. Если это не абстрактный класс или через неабстрактного наследника не перекрывающего этот метод адрес выдернуть метода выдернуть можно просто создав объект этого типа создать делегат с его методом и заменить ссылку на объект на this.


Dax>Чистой воды хак. К тому же со многими "если". Я имел ввиду стандартные("цивилизованные") средства.

Dax>Замечу, что такого рода действия могут очень огорчить GC.
Ну а что же остается делать. В Паскале и не на такое идут. А GC только дедушкин объект и не найдет.
Интересно а каким образом он огорчается???
и солнце б утром не вставало, когда бы не было меня
Re[7]: Неужели на C# такое не сделать???
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 11.12.03 12:51
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну и что? Любой код может привести к ошибкам. Даже такой:


В таком коде ты явно напоганил, а в моем примере ты вроде как ничего криминального не делал.
... << RSDN@Home 1.1.2 beta 2 >>
AVK Blog
Re[6]: Неужели на C# такое не сделать???
От: Dax  
Дата: 11.12.03 13:44
Оценка:
S> Ну а что же остается делать. В Паскале и не на такое идут. А GC только дедушкин объект и не найдет.

Дык из Паскаля из "нетакого" еще и сухим выйти можно. А тут у managed-делегата на _target memcopy предлагается.

private RuntimeMethodInfo _method;
private IntPtr _methodPtr;
private IntPtr _methodPtrAux;
private object _target; //- он самый



S>Интересно а каким образом он огорчается???

У него проблемы с памятью начинаются, в прямом смыле — жуткий склероз
А потом, плачет наверное, тихенько-тихенько
Re[7]: Неужели на C# такое не сделать???
От: Алексей Одинцов Россия  
Дата: 11.12.03 13:48
Оценка:
Здравствуйте, Dax, Вы писали:

Dax>
Dax>private RuntimeMethodInfo _method;
Dax>private IntPtr _methodPtr;
Dax>private IntPtr _methodPtrAux;
Dax>private object _target; //- он самый
Dax>


чего это за обрезок кода?
Re[7]: Неужели на C# такое не сделать???
От: Yury_Malich Германия http://malich.ru
Дата: 11.12.03 13:51
Оценка:
Dax>У него проблемы с памятью начинаются, в прямом смыле — жуткий склероз
Dax>А потом, плачет наверное, тихенько-тихенько

IMO не будет с CG ничего страшного. При слудующей сборке мусора он наверное просто не найдёт ссылку на подменённый объект и его убъёт из кучи
"Практика — критерий истины" (c) Маркс
Re[8]: Неужели на C# такое не сделать???
От: Dax  
Дата: 11.12.03 13:52
Оценка:
Dax>>
Dax>>private RuntimeMethodInfo _method;
Dax>>private IntPtr _methodPtr;
Dax>>private IntPtr _methodPtrAux;
Dax>>private object _target; //- он самый
Dax>>


АО>чего это за обрезок кода?


немножко исходника System.Delegate, прошу прощения, забыл указать
Re[7]: Неужели на C# такое не сделать???
От: Алексей Одинцов Россия  
Дата: 11.12.03 13:57
Оценка:
object Target { get; }

оно read-only. поэтому через делегат это провернуть не получится. только если в unsafe поменять напрямую в памяти указатели. только грязными хаками можно это сделать.
Re[7]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 13:57
Оценка:
Здравствуйте, 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 будет веселее.
и солнце б утром не вставало, когда бы не было меня
Re[8]: Неужели на C# такое не сделать???
От: Dax  
Дата: 11.12.03 14:00
Оценка:
Y_M>IMO не будет с CG ничего страшного. При слудующей сборке мусора он наверное просто не найдёт ссылку на подменённый объект и его убъёт из кучи

Угу, а

private IntPtr _methodPtr;


куда будет указывать?
Re[8]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 14:02
Оценка:
Здравствуйте, Алексей Одинцов, Вы писали:

АО>object Target { get; }


АО>оно read-only. поэтому через делегат это провернуть не получится. только если в unsafe поменять напрямую в памяти указатели. только грязными хаками можно это сделать.

А через отображение через FldInfo ????
и солнце б утром не вставало, когда бы не было меня
Re[9]: Неужели на C# такое не сделать???
От: Алексей Одинцов Россия  
Дата: 11.12.03 14:08
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> А через отображение через FldInfo ????


а кто вам его даст?
Re[9]: Неужели на C# такое не сделать???
От: Алексей Одинцов Россия  
Дата: 11.12.03 14:10
Оценка:
Здравствуйте, Dax, Вы писали:

Y_M>>IMO не будет с CG ничего страшного. При слудующей сборке мусора он наверное просто не найдёт ссылку на подменённый объект и его убъёт из кучи


Dax>Угу, а


Dax>
Dax>private IntPtr _methodPtr;
Dax>


Dax>куда будет указывать?


номер метода это. простой инт.
Re[10]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 14:21
Оценка:
Здравствуйте, Алексей Одинцов, Вы писали:

АО>Здравствуйте, Serginio1, Вы писали:


S>> А через отображение через FldInfo ????


АО>а кто вам его даст?

А разве нет такого флага BindingFlags.Private ????
и солнце б утром не вставало, когда бы не было меня
Re[10]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 14:32
Оценка:
Здравствуйте, Алексей Одинцов, Вы писали:

АО>Здравствуйте, Serginio1, Вы писали:


S>> А через отображение через FldInfo ????


АО>а кто вам его даст?


Можно вообще эту проблему через отображение решить

mi=ТипДедушки.GetMethod("SomeMethod",BindingFlags.Protected | BindingFlags.Instance);
mi.Invoke(this,new object[]);
Просто через делегаты быстрее если ее часто использовать
http://www.rsdn.ru/Forum/?mid=395620
Автор: Serginio1
Дата: 29.09.03
и солнце б утром не вставало, когда бы не было меня
Re[11]: Неужели на C# такое не сделать???
От: Dax  
Дата: 11.12.03 14:36
Оценка:
S>Можно вообще эту проблему через отображение решить

S>mi=ТипДедушки.GetMethod("SomeMethod",BindingFlags.Protected | BindingFlags.Instance);

S> mi.Invoke(this,new object[]);
S> Просто через делегаты быстрее если ее часто использовать

Опять мимо.
В этом случае вызовется свой метод, а не деда. (к слову, нет такого BindingFlags.Protected есть BindingFlags.NonPublic)
Re[12]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 14:40
Оценка:
Здравствуйте, Dax, Вы писали:

S>>Можно вообще эту проблему через отображение решить


S>>mi=ТипДедушки.GetMethod("SomeMethod",BindingFlags.Protected | BindingFlags.Instance);

S>> mi.Invoke(this,new object[]);
S>> Просто через делегаты быстрее если ее часто использовать

Dax>Опять мимо.

Dax>В этом случае вызовется свой метод, а не деда. (к слову, нет такого BindingFlags.Protected есть BindingFlags.NonPublic)
А как через установку _target челез филдИнфо ????
и солнце б утром не вставало, когда бы не было меня
Re[12]: Неужели на C# такое не сделать???
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.12.03 14:42
Оценка:
Здравствуйте, 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 ????
и солнце б утром не вставало, когда бы не было меня
Re[13]: Неужели на C# такое не сделать???
От: Dax  
Дата: 11.12.03 14:52
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Считаешь, что mi вернет не прямой адрес, а ссылку на VMT ????


Естественно, метод же виртуальный.

С FieldInfo тоже облом — не отдает .NET fieldInfo на _target.
Я ж говорю: по честному никак не получится, а хак, он и в Африке на следующей версии .NET прекратит работу.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.