Après googler et à l'atterrissage sur DONC et après avoir lu cette autre question
Est-il possible de construire un bon Délégué à partir d'un MethodInfo si vous ne connaissez pas le nombre ou les types de paramètres au moment de la compilation?
En savoir plus sur cette: peut-on le faire avec élégance, sans l'utilisation de la Réflexion.Émettre ou le type des constructeurs?
C'est sorta une déception pour moi, car Délégué.CreateDelegate me demande de choisir le bon type de Délégué en tant que premier paramètre ou d'autre, il serait de lancer des exceptions ou invoquer une méthode incorrecte.
Je suis en train de construire certains ninja engrenages et cela aide beaucoup... Merci!
Voici une solution générique:
/// <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;
}
Note: je fais construire une application Silverlight qui permettrait de remplacer un haut-ans-il y a javascript de l'application dans laquelle j'ai plusieurs Javascript, des interfaces d'appels dans le même Silverlight [ScriptableMember de la méthode].
Tous ceux héritage JS interfaces doivent être pris en charge ainsi que la nouvelle interface pour l'accès à de nouvelles fonctionnalités, donc quelque chose qui automatiquement des configurations de la JS interface et les "délégués" l'appel pour le droit de Silverlight méthode permet d'accélérer le travail beaucoup.
Je ne peux pas poster le code ici, de sorte que le résumé.