Dopo googling e atterraggio su SO e dopo aver letto this other questionCostruisce un delegato da MethodInfo?
E 'possibile costruire una corretta delegato da un MethodInfo se non sapevi il numero o il tipo di parametri in fase di compilazione?
Ulteriori informazioni su questo: questo può essere fatto elegantemente senza l'uso di Reflection.Emit o tipo di builder?
Questo è un po 'un peccato per me perché Delegate.CreateDelegate mi richiede di specificare il tipo di Delegato corretto come il primo parametro altrimenti genera eccezioni o invoca un metodo errato.
Sto costruendo alcuni ingranaggi ninja e questo sarebbe di grande aiuto ... Grazie!
Ecco una soluzione generica:
/// <summary>
/// Builds a Delegate instance from the supplied MethodInfo object and a target to invoke against.
/// </summary>
public static Delegate ToDelegate(MethodInfo mi, object target)
{
if (mi == null) throw new ArgumentNullException("mi");
Type delegateType;
var typeArgs = mi.GetParameters()
.Select(p => p.ParameterType)
.ToList();
// builds a delegate type
if (mi.ReturnType == typeof(void)) {
delegateType = Expression.GetActionType(typeArgs.ToArray());
} else {
typeArgs.Add(mi.ReturnType);
delegateType = Expression.GetFuncType(typeArgs.ToArray());
}
// creates a binded delegate if target is supplied
var result = (target == null)
? Delegate.CreateDelegate(delegateType, mi)
: Delegate.CreateDelegate(delegateType, target, mi);
return result;
}
Nota: Sto costruendo un'applicazione Silverlight che dovrebbe sostituire un'applicazione javascript anni incorporati fa, in cui ho più Interfacce Javascript che chiamano nello stesso metodo [ScriptableMember] di Silverlight.
Tutte quelle legacy interfacce JS hanno bisogno di essere supportati proprio come la nuova interfaccia per l'accesso a nuove funzioni, in modo da qualcosa che messe a punto automaticamente l'interfaccia JS e "delegati" la chiamata al metodo Silverlight giusta sarebbe aiuta a velocizzare il lavoro molto.
Non riesco a inserire il codice qui, quindi questo è il riassunto.
Lo sto creando per incollare Silverlight [ScriptableMember] e un'interfaccia JavaScript separata, quindi non devo preoccuparmi di mantenere sincronizzate le firme dei metodi in entrambe le posizioni. – chakrit
Wow .... questo ha aiutato molto! Ragazzi, rock! – chakrit
@ Marc Gravell, non sono in grado di richiamare il delegato creato nel codice precedente come d(). Dopo aver cercato su google ho scoperto che dynamicInvoke può essere usato per invocare il metodo, che è molto lento. aiuto di pls. Sono nuovo per delegati ed eventi. il mio requisito è di invocare un metodo in modo dinamico, il numero o il tipo di parametri saranno noti solo in fase di esecuzione – Saranya