J'ai souscrit quelques méthodes à un événement et que vous souhaitez les invoquer par l'ordre spécifique que je leur donne comme ceci:Invocation commande par un attribut spécifique
foreach (var method in LOAD_DEPENDENCIES.GetInvocationList()
.OrderBy(x => x.Method.GetCustomAttributes(typeof(InvocationOrderAttribute),false)))
{
method.DynamicInvoke(localStats, this);
}
où (bien sûr) l'événement est LOAD_DEPENDENCIES
et la l'attribut est InvocationOrderAttibute
. Note que le corps de foreach
fonctionne, les paramètres de DynamicInvoke
ne sont pas le problème.
Ce attribut ressemble à ceci:
public class InvocationOrderAttribute : Attribute , IComparable
{
public int order;
public InvocationOrderAttribute(int order)
{
this.order = order;
}
public int CompareTo(object obj)
{
return this.order.CompareTo((obj as InvocationOrderAttribute).order);
}
}
Je mis en œuvre le IComparable
en espérant que OrderBy
va utiliser pour déterminer l'ordre.
Cela ne fonctionne pas, par le débogage j'ai vérifié que je n'entrerais même jamais dans le corps de cette boucle foreach
. ALL les méthodes souscrites possèdent cet attribut.
Question est, qu'est-ce que je fais mal dans la requête LINQ foreach
ou dans l'attribut?
EDIT:
il est pas le meilleur, mais fonctionne:
foreach (var method in LOAD_DEPENDENCIES.GetInvocationList()
.OrderBy(y => y.Method.GetCustomAttributes(false)
.OfType<InvocationOrderAttribute>().FirstOrDefault().order))
{
method.DynamicInvoke(localStats, this);
}
Merci pour votre réponse. J'utilise ceci pour Unity et avec la version C# 4, où je n'ai pas 'GetCustomAttribute <>' (peut-être pas à cause de la version mais je n'en ai pas). Quelle solution de contournement fonctionnerait dans ce cas? – agiro
'.GetCustomAttributes(). OfType(). FirstOrDefault()' est équivalent –
tinudu
Pas de chance:/ne fait toujours pas ce que je souhaite. – agiro