5

こんにちは、Unity3d で使用されるサブセットである Mono 2.8.2 でメッセンジャーを作成しようとしています。メソッドが「subscribe」属性で装飾されている場合に、メソッドをメッセンジャーに自動サブスクライブするヘルパーを作成するのは気の利いたことだと思いました。

私はこれについて頭を悩ませており、問題の解決策なしに他の関連するスタックの質問の多くを読みました。率直に言って、私が何か間違ったことをしているのか、それとも 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