【发布时间】:2016-01-05 19:37:40
【问题描述】:
我正在尝试为特殊效果制作一个事件系统
我有这个函数在一个静态类中,允许我将任何基本事件处理程序链接到任何基本事件,无论每个对象的类如何,只要它们具有所需的功能
这里是函数
(在具有多个非常有用的通用函数的公共静态类中
public static bool eventLinker<T,Y>(T listener, Y speaker, string eventName, string eventHandler)
{
EventInfo eInfo = typeof(Y).GetEvent(eventName);
MethodInfo evHandler = typeof(T).GetMethod(eventHandler, new Type[2] {typeof(object), typeof(EventArgs)});
Type handlerType = eInfo.EventHandlerType;
if(eInfo != null && evHandler != null && handlerType != null)
{
Delegate d = Delegate.CreateDelegate(handlerType, speaker, evHandler);
eInfo.AddEventHandler(listener,d);
return true;
}
return false;
}
这应该适用于任何有 公共事件EventHandlerSomethingHappened;
public void nameOfTheFunctionThatTriggerTheEvent()
{
EventHandler handler = SomethingHappened;
if(handler != null)
{
handler(this, EventArgs.Empty);
}
}
与任何拥有的班级
public void HandleEvent(object sender, EventArgs e)
{
Debug.Log("Something happened to " + sender);
}
我总是在 Delegate.CreateDelegate 收到此错误
ArgumentException:方法参数不兼容 System.Delegate.CreateDelegate(System.Type 类型,System.Object firstArgument,System.Reflection.MethodInfo 方法,布尔值 throwOnBindFailure) (在 /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Delegate.cs:263) System.Delegate.CreateDelegate(System.Type 类型,System.Object firstArgument,System.Reflection.MethodInfo 方法)(在 /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Delegate.cs:276) FunctionExt.eventLinker[Effect,Test](.Effect 监听器,.Test 扬声器, System.String eventName, System.String eventHandler) (在 Assets/_C#/FunctionExt.cs:41) GameUpdate.Awake () (在 Assets/_C#/GameUpdate.cs:84)
我在任何地方都找不到解决方案。
【问题讨论】:
标签: c# reflection unity3d delegates mono