2013-10-01 1 views
5

Hallo Ich versuche, einen Messenger in Mono 2.8.2 zu erstellen - die von Unity3d verwendete Untergruppe. Ich dachte, es wäre geschickt, einen Helfer zu erstellen, der dem Messenger automatisch Methoden hinzufügt, wenn sie mit einem "subscribe" -Attribut versehen sind.Einen Delegaten aus methodInfo in Mono erstellen 2.8.2

Ich habe mir den Kopf darüber gekratzt und viele der anderen verwandten Stack-Fragen ohne eine Lösung für mein Problem gelesen. 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); 
     } 

Irgendwelche Vorschläge oder um klar sein, funktionieren würde.

bearbeiten Die Signatur der Methode wie folgt aussieht:

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

Obwohl es ursprünglich war ...

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

Wie lautet die Signatur der Methode, die Sie abonnieren möchten? Hat es eine Signatur wie 'void MyMethod (object arg)'? –

+0

Korrigieren. Ich habe den Beitrag aktualisiert. – user2085865

+1

Mono 2.8 ist extrem alt, bitte upgraden Sie auf 3.2.3 – knocte

Antwort

6

Es ist eine nicht-statische Methode und Sie lieferten kein Ziel Objekt. Daher wird Delegate.CreateDelegate einen "offenen Delegaten" mit einem expliziten this Argument erstellen.

Aufgrund des erforderlichen this Arguments stimmt es nicht mehr mit der Signatur überein.

+0

Ich bekomme mich über ein Problem und vermisse das Offensichtliche. Ich muss lernen, den Kaffee abzulegen und mit meiner Katze spielen. – user2085865

+1

Es ist eine lange Zeit, aber diese Antwort hilft wirklich. '(Aktion ) Delegate.CreateDelegate (typeof (Aktion ), ** this **, methodInfo);' wird es richtig machen. –