⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eventforwarder.cs

📁 SharpDevelop2.0.0 c#开发免费工具
💻 CS
字号:
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
//     <version>$Revision: 915 $</version>
// </file>

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace CustomSinks
{
	public delegate void EventForwarderEventHandler(object sender, EventForwarderEventArgs args);

	public class EventForwarderEventArgs:EventArgs
	{
		bool invoked = false;
		Delegate realEvent;
		object[] args;

		public bool WasInvoked {
			get {
				return invoked;
			}
		}

		public void InvokeEvent()
		{
			if (invoked) {
				return;
			}

			realEvent.DynamicInvoke(args);

			invoked = true;
		}

		public EventForwarderEventArgs(Delegate realEvent, object[] args)
		{
			this.realEvent = realEvent;
			this.args = args;
		}
	}

	public class EventForwarder:MarshalByRefObject
	{
		public static event EventForwarderEventHandler EventReceived;

		Delegate realDelegate;
		Delegate proxyDelegate;

		public Delegate ProxyDelegate {
			get {
				return proxyDelegate;
			}
		}

		public EventForwarder(Delegate realDelegate)
		{
			this.realDelegate = realDelegate;

			Type type = realDelegate.GetType();
			MethodInfo proxyMethod = typeof(EventForwarder).GetMethod("ForwardEvent" + realDelegate.Method.GetParameters().Length);
			proxyDelegate = Delegate.CreateDelegate(type, this, proxyMethod);
		}

		void InvokeEvent(params object[] par)
		{
			Console.WriteLine("Remoting event received: " + realDelegate.Method.Name);
			EventForwarderEventArgs args = new EventForwarderEventArgs(realDelegate, par);

			if (EventReceived != null) {
				EventReceived(this, args);
			}
			
			// Invoke event if it was not already invoked
			if (!args.WasInvoked) {
				if (Application.OpenForms.Count > 0) {
					Application.OpenForms[0].Invoke(new EventHandler(delegate
					{
						args.InvokeEvent();
					}));
				} else {
					args.InvokeEvent();
				}
			}
		}

		public void ForwardEvent0()
		{
			InvokeEvent(new object[] {});
		}

		public void ForwardEvent1(object p1)
		{
			InvokeEvent(new object[] { p1});
		}

		public void ForwardEvent2(object p1, object p2)
		{
			InvokeEvent(new object[] { p1, p2});
		}

		public void ForwardEvent3(object p1, object p2, object p3)
		{
			InvokeEvent(new object[] { p1, p2, p3});
		}

		public void ForwardEvent4(object p1, object p2, object p3, object p4)
		{
			InvokeEvent(new object[] { p1, p2, p3, p4});
		}

		public void ForwardEvent5(object p1, object p2, object p3, object p4, object p5)
		{
			InvokeEvent(new object[] { p1, p2, p3, p4, p5});
		}

		public void ForwardEvent6(object p1, object p2, object p3, object p4, object p5, object p6)
		{
			InvokeEvent(new object[] { p1, p2, p3, p4, p5, p6});
		}

		public void ForwardEvent7(object p1, object p2, object p3, object p4, object p5, object p6, object p7)
		{
			InvokeEvent(new object[] { p1, p2, p3, p4, p5, p6, p7});
		}

		public void ForwardEvent8(object p1, object p2, object p3, object p4, object p5, object p6, object p7, object p8)
		{
			InvokeEvent(new object[] { p1, p2, p3, p4, p5, p6, p7, p8});
		}

		public void ForwardEvent9(object p1, object p2, object p3, object p4, object p5, object p6, object p7, object p8, object p9)
		{
			InvokeEvent(new object[] { p1, p2, p3, p4, p5, p6, p7, p8, p9});
		}

		public void ForwardEvent10(object p1, object p2, object p3, object p4, object p5, object p6, object p7, object p8, object p9, object p10)
		{
			InvokeEvent(new object[] { p1, p2, p3, p4, p5, p6, p7, p8, p9, p10});
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -