5

您好我正在尝试在 Mono 2.8.2 中创建一个信使 - Unity3d 使用的子集。我认为创建一个助手以在使用“订阅”属性装饰时自动订阅信使方法会很不错。

我一直在为此挠头,并阅读了许多其他相关的堆栈问题,但没有解决我的问题。坦率地说,我不知道我做错了什么,或者这是否是 Mono 中的错误。

foreach (var methodInfo in methods)
        {
            var attr = methodInfo.GetAttribute<SubscribeAttribute>();
            if (attr == null)
                continue;

            var parmas = methodInfo.GetParameters();
            if (parmas.Length != 1)
            {
                Debug.LogError("Subscription aborted. Invalid paramters.");
                continue;
            }

            var type = parmas[0].ParameterType;

            // Crashes here
            // ArgumentException: method argument length mismatch
            // I have tried many combinations.. 
            // Direct typing of the message type and dynamic typing

            var action = (Action<object>)Delegate.CreateDelegate(typeof(Action<object>), methodInfo);

             // also does not work
             // var dt = Expression.GetActionType(parmas.Select(o => o.ParameterType).ToArray());
             // var action = Delegate.CreateDelegate(dt, methodInfo);

            Subscribe(type, action, instance);
        }

任何建议或解决方法将不胜感激。

编辑 方法签名看起来像:

[Subscribe]
void OnMessage(object message){
  // Hello World
}

虽然,原本...

[Subscribe]
void OnTestMessage(TestMessage message){
  // Hello World
}
4

1 回答 1

6

这是一个非静态方法,您没有提供目标对象。因此Delegate.CreateDelegate将创建一个带有显式this参数的“开放委托”。

由于必需的this参数,它不再与签名匹配。

于 2013-10-02T01:23:48.910 回答