2010-01-28 5 views

Répondre

5

Vous pouvez le faire en plaçant toutes les méthodes de la type ayant le même type de retour, et la même séquence de types dans les paramètres:

var matchingMethods = o.GetType().GetMethods().Where(mi => 
    mi.ReturnType == gs.Method.ReturnType 
    && mi.GetParameters().Select(pi => pi.ParameterType) 
     .SequenceEqual(gs.Method.GetParameters().Select(pi => pi.ParameterType))); 
+0

cela fonctionne. De plus, est-il possible de savoir si 'gs' est un délégué à 'o'? – Fabiano

+1

@Fabiano: oui, grâce à 'gs.Target':' if (gs.Target == o) {/ * gs représente une méthode dans l'instance o * /} ' –

+0

Merci. Je viens de découvrir que la deuxième réponse suffirait pour mon cas :-) – Fabiano

7
// You may want to tweak the GetMethods for private, static, etc... 
foreach (var method in o.GetType().GetMethods(BindingFlags.Public)) 
{ 
    var del = Delegate.CreateDelegate(gs.GetType(), method, false); 
    if (del != null) 
    { 
     Console.WriteLine("o has a method that matches the delegate type"); 
    } 
} 
+0

Cela ne semble pas fonctionner. Est-il possible que Delegate.CreateDelegate ne fonctionne que pour les méthodes statiques? – Fabiano

+1

Pour les méthodes par exemple, vous devez utiliser une autre signature, en passant la référence à une instance: 'Delegate.CreateDelegate (gs.GetType(), o, méthode, false);' – torvin

Questions connexes