Supposons que j'aichangement C# cible action/délégué: appels hiérarchiques
public IList<Entity> Children { get; set; }
public NotifyChildren(Func<object, bool> action, object data)
{
foreach (var child in Children)
if (action(data))
/// <-- !!!! need action to work on child this time, not on the original target
//child.NofifyChildren(action, data); <- this doesn't work because of the above requirement
child.NotifyChildren(action.ChangeTargetTo(child), data); // << pseudocode!
}
public void SomeChangeOccured()
{
var changedChild;
NotifyChildren(x => x.SomeHandler(), "somedata");
}
Comment puis-je changer la cible de l'action? Je suis OK pour passer un délégué au lieu de l'action mais son .Target est en lecture seule, aussi. Je pense actuellement en train de faire
public NotifyChildren(Expression<Func<Entity, bool>> action, object data)
{
// so that I can do method.Invoke(newtarget, new object[]{data});
NotifyChildren(((MethodCallExpression)action).Method, data);
}
qui est, passer de l'action à l'appel de la méthode réfléchie ... mais il est un peu laid, est-ce pas?
J'ai le sentiment que la solution est très simple et je la connaissais ... juste oublié. Hm, une solution serait d'avoir un délégué statique qui accepte Entity comme premier paramètre, mais je ne voudrais pas aller de cette façon.
Votre exemple de code situé dans la classe nommée entité? –
En fait, il est situé dans la classe Parent mais cela n'a pas d'importance. Dans cet exemple, je l'ai écrit comme s'il se trouvait dans la classe Enfant. – queen3
En fait, je pense que cela rend votre question ambiguë: Entité est un objet hiérarchique (avec une référence de soi) ou non? Votre objectif est-il de notifier de manière récurrente les entités enfants d'un changement survenu sur votre entité racine? Enfin, quel est le point d'entrée du processus? –