Следить за управлением для определения запускаемых событий?

Вы можете использовать DocumentClient.UpsertDocumentAsync вместо CreateDocumentAsync, чтобы создать новый документ или обновить существующий, например:

await _client.UpsertDocumentAsync(collectionLink, document);

8
задан BikeMrown 31 March 2009 в 16:05
поделиться

3 ответа

Вы могли использовать отражение, но это будет немного хитрым из-за различных включенных подписей обработчика событий. В основном необходимо было бы добраться EventInfo для каждого события в типе и использования EventHandlerType свойство для разработки, что тип делегата создать перед вызовом AddEventHandler. Delegate.CreateDelegate работы для всего, что следует за нормальным шаблоном обработчика событий хотя...

Вот демонстрационное приложение. Обратите внимание, что это не делает никакой проверки - если Вы дадите ему что-то с "нестандартным" событием, то это выдаст исключение. Вы могли довольно легко использовать отражение для распечатывания события args также.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;

namespace ConsoleApp
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Form form = new Form { Size = new Size(400, 200) };
            Button button = new Button { Text = "Click me" };
            form.Controls.Add(button);
            EventSubscriber.SubscribeAll(button);
            Application.Run(form);
        }
    }

    class EventSubscriber
    {
        private static readonly MethodInfo HandleMethod = 
            typeof(EventSubscriber)
                .GetMethod("HandleEvent", 
                           BindingFlags.Instance | 
                           BindingFlags.NonPublic);

        private readonly EventInfo evt;

        private EventSubscriber(EventInfo evt)
        {
            this.evt = evt;
        }

        private void HandleEvent(object sender, EventArgs args)
        {
            Console.WriteLine("Event {0} fired", evt.Name);
        }

        private void Subscribe(object target)
        {
            Delegate handler = Delegate.CreateDelegate(
                evt.EventHandlerType, this, HandleMethod);
            evt.AddEventHandler(target, handler);
        }

        public static void SubscribeAll(object target)
        {
            foreach (EventInfo evt in target.GetType().GetEvents())
            {
                EventSubscriber subscriber = new EventSubscriber(evt);
                subscriber.Subscribe(target);
            }
        }
    }
}
8
ответ дан 5 December 2019 в 19:02
поделиться

Я думаю, что Вы могли использовать Отражение, чтобы сделать это.

1
ответ дан 5 December 2019 в 19:02
поделиться

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

// fire event
if (EventDelegate != null)
   EventDelegate(eventArgs);

Таким образом, событие даже не запущено, если никто не подписывается на него

0
ответ дан 5 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: