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
}
Wie lautet die Signatur der Methode, die Sie abonnieren möchten? Hat es eine Signatur wie 'void MyMethod (object arg)'? –
Korrigieren. Ich habe den Beitrag aktualisiert. – user2085865
Mono 2.8 ist extrem alt, bitte upgraden Sie auf 3.2.3 – knocte