J'ai recours à un hack horrible pour remplir un type de données verrouillé dans le framework XNA: il existe une méthode interne dans une structure que je souhaite appeler sans alimenter le garbage collector.Appeler une méthode interne sur une structure
Si je continue à ladite structure en boîte dans une variable d'objet et utiliser MethodInfo.Invoke()
, cet appel alimenterait lui-même le garbage collector par la boxe les paramètres:
private object boxedTouchCollection;
void test() {
MethodInfo addTouchLocationMethod = typeof(TouchCollection).GetMethod(
"AddTouchLocation", BindingFlags.Instance | BindingFlags.NonPublic
);
addTouchLocationMethod.Invoke(
this.boxedState, new object[] { /* parameters being boxed */ }
);
}
Je ne suis pas sûr que Delegate.CreateDelegate()
peut être utilisé ici - puis-je simplement transformer le premier paramètre en un objet et cela fonctionnera sur la structure en boîte? Ou puis-je stocker ma structure unboxed et déclarer le premier paramètre comme ref TouchCollection
?
delegate void AddTouchLocationDelegate(
ref TouchCollection collection,
int id,
// ...more parameters...
);
private TouchCollection touchCollection;
void test() {
Delegate.CreateDelegate(
typeof(AddTouchLocationDelegate),
typeof(ref TouchCollection), // doesn't compile
addTouchLocationMethod
);
}
Est-il possible que je peux faire Delegate.CreateDelegate()
travail? Ou devrais-je recourir à la génération dynamique d'IL?
Merci beaucoup! Je n'ai pas encore essayé cette surcharge. Fonctionne très bien, zéro déchet. – Cygon