2013-10-01 1 views
5

こんにちは私はMono 2.8.2でUnity3dで使用されるサブセットを作成しようとしています。私はメッセンジャーに "subscribe"属性で装飾されているメソッドを自動的に購読するヘルパーを作成するのは面白いと思った。モノでmethodInfoから代理人を作成する2.8.2

私はこれに頭を悩まされていて、他の関連するスタックの質問の多くを私の問題の解決なしに読んだことがあります。 Frankly, I don't know if I am doing something wrong or if this is a bug in 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 
} 
+0

登録しようとしているメソッドの署名は何ですか? 'void MyMethod(object arg)'のようなシグネチャを持っていますか? –

+0

正しい。私は投稿を更新しました。 – user2085865

+1

モノ2.8は非常に古く、3.2.3にアップグレードしてください – knocte

答えて

6

ましたオブジェクト。したがって、Delegate.CreateDelegateは明示的にthis引数を持つ「オープンデリゲート」を作成します。

引数が必要なため、それはもはや署名と一致しません。

+0

私は自分自身を問題に巻き込んで、明らかに見逃す。私はコーヒーを寝かし、私の猫と遊ぶことを学ぶ必要があります。 – user2085865

+1

長いことがありましたが、この回答が本当に役立ちます。 '(アクション)Delegate.CreateDelegate(typeof(アクション)、** this **、methodInfo);は正しく動作します。 –

関連する問題