Перехват событий пост сторонних компонентов - PullRequest
1 голос
/ 23 августа 2011

У меня вопрос по поводу перехвата событий с c # и Postsharp.

Я хотел бы отменить выполнение таких событий, как BeforeDropDown, RowSelected MouseClick с EventInterceptionAspect в postsharp.

Но я не могу найти подходящее место, где я могу написать код. Пример:

я пробовал что-то вроде этого:

[Serializable]
class EventInter : EventInterceptionAspect
{
    public override bool CompileTimeValidate(System.Reflection.EventInfo targetEvent)
    {
        return "FormClosed".Equals(targetEvent.Name);
    }

    public override void OnInvokeHandler(EventInterceptionArgs args)
    {
        if condition executes method otherwise no
    }
}

в форме:

[EventInter]
public partial class Frm_RomperMesa : KryptonForm

Но это не сработало. Поэтому я хочу знать, возможно ли достичь того, чего я хочу.

Спасибо заранее. Я надеюсь, будет ясно.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

Обходной путь состоит в том, чтобы сделать это наоборот: используйте аспект метода, который связан с событием, и отмените нормальное выполнение метода, если условие выполнено. Это не мешает формированию формы события, но предотвращает выполнение кода обработки события.

[EventInter]
private void someForm_FormClosed(object sender, EventArg arg) {}

Мы часто используем этот подход в нашем проекте. У нас есть несколько аспектов, которые применяются к методам обработки событий (обработка исключений, обработка курсоров и т. Д.).

Мы идем немного дальше, применяем аспекты на уровне сборки и используем CompileTimeValide для распознавания сигнатуры метода обработки событий. Теоретически, это не на 100% надежно, но мы пока не обнаружили проблем с этим подходом.

0 голосов
/ 23 августа 2011

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

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

вам придется изменить сборку, чтобы сделать это. Используйте следующий аспект и ссылки для изменения вашего

public class EventAspectProvider : TypeLevelAspect , IAspectProvider
    {
        public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
        {
            Type t = (Type)targetElement;

            EventInfo e = t.GetEvents().First(c => c.Name.Equals("FormClosing"));

            return new List<AspectInstance>() { new AspectInstance(e, new EventInter()) };
        }

    }

    [Serializable]
    public class EventInter : EventInterceptionAspect
    {

        public override void OnInvokeHandler(EventInterceptionArgs args)
        {
            int x = 0;

            if (x > 0) //Do you logic here
            {
                args.ProceedInvokeHandler();
            }
        }
    }

В основном это сводится к изменению System.Windows.Forms.dll, который я не рекомендую. Но если это какая-то другая сторонняя библиотека вендоров, то сделайте это.

...