Pour créer des délégués à la volée, les techniques varient de Delegate.CreateDelegate à Expresion Lambda, DynamicMethod, etc. Toutes ces techniques exigent que vous sachiez le tapez du délégué. J'essaie de convertir les délégués fermés en délégués ouverts génériquement, et pour ce faire, il semble que je dois créer dynamiquement le type de délégué ouvert avant de pouvoir créer le délégué qui en résulte. Considérez:Comment définir un type de délégué lors de l'exécution (type délégué dynamique)
pubic class WeakEvent<TDelegate> where TDelegate : class
{
public WeakEvent(Delegate aDelegate)
{
var dgt = aDelegate as TDelegate;
if(dgt == null)
throw new ArgumentException("aDelegate");
MethodInfo method = dgt.Method;
var parameters = Enumerable
.Repeat(dgt.Target.GetType(),1)
.Concat(method.GetParameters().Select(p => p.ParameterType));
Type openDelegateType = // ??? original delegate, with new 1st arg for @this
var dm = new DynamicMethod("InnerCode", method.ReturnType, parameters);
... your favourite IL code emmisions go here
var openDelegate = dm.CreateDelegate(openDelegateType);
}
}
Le purpsoe du code ci-dessus est de créer un nouveau délégué qui est identique au délégué d'origine, mais a un nouveau 1er argument en faveur de cette ... soit une version ouverte de la fermeture précédemment déléguer.
Existe-t-il un moyen simple de cloner & modifier un type de délégué existant, ou est la solution la plus proche pour construire les types génériques Func <> et Action <>?