ArgumentException:方法参数不兼容
ArgumentException : method arguments are incompatible
我正在尝试为特效制作一个事件系统
我有这个函数作为静态 class 允许我 link 任何基本事件的任何基本事件处理程序,无论每个对象的 classes,只要因为他们有需要的功能
这里是函数
(在 public 静态 class 中具有多个非常有用的通用函数
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;
}
这应该适用于任何 class 拥有
public 事件 EventHandler SomethingHappened;
public void nameOfTheFunctionThatTriggerTheEvent()
{
EventHandler handler = SomethingHappened;
if(handler != null)
{
handler(this, EventArgs.Empty);
}
}
与 class 有
public void HandleEvent(object sender, EventArgs e)
{
Debug.Log("Something happened to " + sender);
}
我总是在 Delegate.CreateDelegate
收到此错误
ArgumentException: method arguments are incompatible
System.Delegate.CreateDelegate (System.Type type, System.Object
firstArgument, System.Reflection.MethodInfo method, Boolean
throwOnBindFailure) (at
/Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Delegate.cs:263)
System.Delegate.CreateDelegate (System.Type type, System.Object
firstArgument, System.Reflection.MethodInfo method) (at
/Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Delegate.cs:276)
FunctionExt.eventLinker[Effect,Test] (.Effect listener, .Test speaker,
System.String eventName, System.String eventHandler) (at
Assets/_C#/FunctionExt.cs:41) GameUpdate.Awake () (at
Assets/_C#/GameUpdate.cs:84)
我在任何地方都找不到解决方案。
您的错误所在行:
Delegate d = Delegate.CreateDelegate(handlerType, speaker, evHandler);
eInfo.AddEventHandler(listener,d);
AddEventHandler
想知道您要将 delegate
绑定到哪个 event
。所以它必须是:
Delegate d = Delegate.CreateDelegate(handlerType, listener, evHandler);
eInfo.AddEventHandler(speaker,d);
我试过了。我花了一段时间才弄明白。
首先,AddEventHandler
需要目标作为第一个参数,而您传递的侦听器不正确。
接下来,当您创建委托时,您应该使用另一个方法签名 CreateDelegate
因为第一个参数将从处理程序调用传递(请参阅您的代码 handler(this, EventArgs.Empty);
)。
全部代码:
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, listener, eventHandler);
eInfo.AddEventHandler(speaker, d);
return true;
}
return false;
}
或者您可以使用替代的更通用和更安全的代码来检查创建委托上存在的事件处理程序:
public static bool eventLinker<T, Y>(T listener, Y speaker, string eventName, string eventHandler)
{
EventInfo eInfo = typeof(Y).GetEvent(eventName);
Type handlerType = eInfo.EventHandlerType;
if (eInfo != null && handlerType != null)
{
Delegate d = Delegate.CreateDelegate(handlerType, listener, eventHandler, false, false);
if (d != null)
{
eInfo.AddEventHandler(speaker, d);
return true;
}
}
return false;
}
最后一个示例没有 hard-coded 处理程序参数 typeof(object), typeof(EventArgs)
然后可以处理具有自定义事件类型的场景。
如果您使用的是 Unity (IF),
我遇到了同样的问题,我所要做的就是为造成这个问题的任何元素创建另一个对象,然后只需从导致问题的对象的检查器中复制组件并将其粘贴到您创建的新对象中,然后它起作用了,我不知道为什么但它确实起作用了,只需确保从检查器中复制并粘贴每个组件并将其粘贴到一个新组件中。
我正在尝试为特效制作一个事件系统
我有这个函数作为静态 class 允许我 link 任何基本事件的任何基本事件处理程序,无论每个对象的 classes,只要因为他们有需要的功能
这里是函数
(在 public 静态 class 中具有多个非常有用的通用函数
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;
}
这应该适用于任何 class 拥有 public 事件 EventHandler SomethingHappened;
public void nameOfTheFunctionThatTriggerTheEvent()
{
EventHandler handler = SomethingHappened;
if(handler != null)
{
handler(this, EventArgs.Empty);
}
}
与 class 有
public void HandleEvent(object sender, EventArgs e)
{
Debug.Log("Something happened to " + sender);
}
我总是在 Delegate.CreateDelegate
收到此错误ArgumentException: method arguments are incompatible System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Delegate.cs:263) System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Delegate.cs:276) FunctionExt.eventLinker[Effect,Test] (.Effect listener, .Test speaker, System.String eventName, System.String eventHandler) (at Assets/_C#/FunctionExt.cs:41) GameUpdate.Awake () (at Assets/_C#/GameUpdate.cs:84)
我在任何地方都找不到解决方案。
您的错误所在行:
Delegate d = Delegate.CreateDelegate(handlerType, speaker, evHandler);
eInfo.AddEventHandler(listener,d);
AddEventHandler
想知道您要将 delegate
绑定到哪个 event
。所以它必须是:
Delegate d = Delegate.CreateDelegate(handlerType, listener, evHandler);
eInfo.AddEventHandler(speaker,d);
我试过了。我花了一段时间才弄明白。
首先,AddEventHandler
需要目标作为第一个参数,而您传递的侦听器不正确。
接下来,当您创建委托时,您应该使用另一个方法签名 CreateDelegate
因为第一个参数将从处理程序调用传递(请参阅您的代码 handler(this, EventArgs.Empty);
)。
全部代码:
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, listener, eventHandler);
eInfo.AddEventHandler(speaker, d);
return true;
}
return false;
}
或者您可以使用替代的更通用和更安全的代码来检查创建委托上存在的事件处理程序:
public static bool eventLinker<T, Y>(T listener, Y speaker, string eventName, string eventHandler)
{
EventInfo eInfo = typeof(Y).GetEvent(eventName);
Type handlerType = eInfo.EventHandlerType;
if (eInfo != null && handlerType != null)
{
Delegate d = Delegate.CreateDelegate(handlerType, listener, eventHandler, false, false);
if (d != null)
{
eInfo.AddEventHandler(speaker, d);
return true;
}
}
return false;
}
最后一个示例没有 hard-coded 处理程序参数 typeof(object), typeof(EventArgs)
然后可以处理具有自定义事件类型的场景。
如果您使用的是 Unity (IF), 我遇到了同样的问题,我所要做的就是为造成这个问题的任何元素创建另一个对象,然后只需从导致问题的对象的检查器中复制组件并将其粘贴到您创建的新对象中,然后它起作用了,我不知道为什么但它确实起作用了,只需确保从检查器中复制并粘贴每个组件并将其粘贴到一个新组件中。