class Class3 : Class2
{
public Class3(bool DisableEvent): base(DisableEvent)
{
// тут нужно отписаться
}
}
Как отписаться от события
В общем ситуация такая: есть три класса("Class1","Class2","Class3")...
"Class1" содержит публичное событие "Event1"
Структура "Class2":
Код:
class Class2
{
private Class1 _fieldName;
public Class1 FieldName
{
get { this._fieldName }
}
public Class2()
{
this._fieldName.Event1 += new System.EventHandler(method1);
}
private void method1(object sender, EventArgs e)
{
}
}
{
private Class1 _fieldName;
public Class1 FieldName
{
get { this._fieldName }
}
public Class2()
{
this._fieldName.Event1 += new System.EventHandler(method1);
}
private void method1(object sender, EventArgs e)
{
}
}
Код:
class Class3 : Class2
{
public Class3(): base()
{
// тут нужно отписаться
}
}
{
public Class3(): base()
{
// тут нужно отписаться
}
}
Спасибо за помощь...
Писал по памяти, если есть вопросы спрашивайте!!!
Через reflection я нашёл MethodInfo нужного метода, я просто низнаю, что мне счас делат с этим MethodInfo, как отписать?!!!
Код:
this._fieldName.Event1 -= method1;
Нет такой вариант не подходит))) я бы и сам так сделал))) Внимательнее вопрос прочитайте... method1 приватный, и прочтите примичание... Спс за отзыв!
Цитата: xWinDx
Нет такой вариант не подходит))) я бы и сам так сделал))) Внимательнее вопрос прочитайте... method1 приватный, и прочтите примичание... Спс за отзыв!
сделай паблик метод, который отписывается.
protected - будет виден только потомкам.
конструктор базового класса с параметром.
Спасибо за помощь..."
Код:
Но вообще-то, эвент не для того, чтобы его обрабатывал приватный метод того же класса, где можно поднять эвент.
Излишне это - если вам надо что-то сделать внутри класса - так и делайте, вызывайте метод, поднимайте эвент - но для кого-то внешнего!
Может вам эвент вообще и не нужен.
Ладно, спасибо... но у меня именно такая ситуация... ВОПРОС ОТКРЫТ!
Вообще-то, это врядли. Эвенты и делегаты - самая кривая часть в дотнете, в смысле логики ООП.
Цитата: xWinDx
Ладно, спасибо... но у меня именно такая ситуация... ВОПРОС ОТКРЫТ!
Рейтинг на сайте у вас такой - бывает, что и этого не знают.....
:-)
Если подставить фальшивый метод - то ничего не происходит,
Все остальные свойства делегата (чтобы сделать точно такой же, и чтобы -= смог его в списке обработчиков удалить) только для чтения.
Делегаты не приводятся один к другому, даже если их сигнатуры совпадают.
Отписаться от эвента может только тот, кто на него подписался.
Это откуда инфа?
Код:
static void Main(string[] args)
{
Atom ddd = new Atom();
// MethodInfo dddInfo = ddd.GetType().GetMethod ("ddd_TestEv");
// ddd.TestEv -= dddInfo.MethodHandle.GetFunctionPointer();
// MetodForRemove metodFromBase;
// metodFromBase.Method.MethodHandle = dddInfo.MethodHandle ;
ddd.TestEv -= false_metod;
ddd.RiseTestEvent();
}
static void false_metod(object sender, EventArgs e)
{
throw new NotImplementedException();
}
{
Atom ddd = new Atom();
// MethodInfo dddInfo = ddd.GetType().GetMethod ("ddd_TestEv");
// ddd.TestEv -= dddInfo.MethodHandle.GetFunctionPointer();
// MetodForRemove metodFromBase;
// metodFromBase.Method.MethodHandle = dddInfo.MethodHandle ;
ddd.TestEv -= false_metod;
ddd.RiseTestEvent();
}
static void false_metod(object sender, EventArgs e)
{
throw new NotImplementedException();
}
Цитата: xWinDx
Это откуда инфа?
Про проблему с делегатами у Троэлсена читал.
Они не поняли тогда, что это надо сделать.
но это глупо - если уж, то пусть сделают открытый метод для выключения!
Еще можно метод- обработчик сделать открытым и виртуальным, а в потомке - переопределить, и не делать ничего.
Будет эквивалентно отмене.
Но все равно - если базовый класс подписывается на свой собственный эвент - значит ему это очень нужно.
Ну допустим, логгер, или авторизация какая. А вы ее подавить хотите? Угадал?
:-)
нет, задача у меня тривиальная и мне просто нужно переписать обработчик события под свой... и да, загвоздка в том что классы 1 и 2 не мои( ладно, спс буду пытаться, я уверен что такое возможно...
А что, внутренний обработчик мешает? может его можно просто игнорировать? Что такого он делает?
В общем случае - легче и быстрее переписать нужный функционал.
Или даже подписаться на этот же эвент и удалять последствия работы предыдущего обработчика - из разряда извращений.
Дело в том, что обработчик который необходима удалить, приводит нужную мне переменную к определённому типу(в Классе2), а в наследованном классе (Класс3, мой)... это переменная другого типа, вследствии чего возникает исключение
используйте то, что есть.
А если не хватает точности или еще чего - то добавьте функционал, сделайте свою переменную нужного типа.
Когда надо ее отдать предкам - конвертируйте обратно.
потом - если это класс - вы же можете отнаследоваться, и приведение потомка к предку никак не помешает. Данные не потеряются, предки будут видеть свои поля, а вы - свои.
В том то и дело, если я сделаю так, как вы описали выше, то вообще теряет смысл всего моего функционала... измение типа переменной и есть оснавная задача...
Цитата: xWinDx
В том то и дело, если я сделаю так, как вы описали выше, то вообще теряет смысл всего моего функционала... измение типа переменной и есть оснавная задача...
Это интерфейс
:-)
А лучший код - это не написанный код!
:-)))
Серьезно, у вас с дизайном какой-то косяк.
Не представляю задачи, когда класс автомобиль отнаследовали и сделали Хондой, а потом базовый класс приводит Хонду к велосипеду, на основании наличия колес.
Опишите подробнее как у вас классы организованы.
Я поковырялся и УВЕРЯЮ -- это сделать можно!!!
Код:
class Class3 : Class2
{
public Class3(): base()
{
// тут нужно отписаться
var methodInfo = baseType.GetMethod("adapter_Changed", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
var eventInfo = base.Adapter.GetType().GetEvent("Changed");
}
}
{
public Class3(): base()
{
// тут нужно отписаться
var methodInfo = baseType.GetMethod("adapter_Changed", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
var eventInfo = base.Adapter.GetType().GetEvent("Changed");
}
}
В обшем проблема решена, если кому интересно могу скинуть решение!
Цитата: xWinDx
В обшем проблема решена, если кому интересно могу скинуть решение!
ну конечно.
var methodInfo = baseType.GetMethod("adapter_Changed", BindingFlags.NonPublic | BindingFlags.Instance);
base.Adapter.Changed -= Delegate.CreateDelegate(typeof(EventHandler), this, methodInfo) as EventHandler;