Est-il possible de réfléchir sur une implémentation d'interface explicite à partir de la pile d'appels? Je veux utiliser cette information pour rechercher un attribut sur l'interface elle-même.Comment réfléchir sur l'implémentation d'interface explicite C# à partir de la pile d'appels?
Donné ce code:
interface IFoo
{
void Test();
}
class Foo : IFoo
{
void IFoo.Test() { Program.Trace(); }
}
class Program
{
static void Main(string[] args)
{
IFoo f = new Foo();
f.Test();
}
public static void Trace()
{
var method = new StackTrace(1, false).GetFrame(0).GetMethod();
// method.???
}
}
Plus précisément, dans Trace(), je voudrais être en mesure d'obtenir à typeof(IFoo)
de method
.
Dans la fenêtre de la montre, si je regarde method.ToString()
il me donne Void InterfaceReflection.IFoo.Test()
(InterfaceReflection est le nom de mon assemblée). Comment puis-je obtenir typeof(IFoo)
à partir de là? Dois-je utiliser une recherche de type basée sur le nom à partir de l'assemblage lui-même, ou y a-t-il un Type IFoo
caché quelque part dans le MethodBase
?
MISE À JOUR:
Voici la solution finale, grâce à Kyte
public static void Trace()
{
var method = new StackTrace(1, false).GetFrame(0).GetMethod();
var parts = method.Name.Split('.');
var iname = parts[parts.Length - 2];
var itype = method.DeclaringType.GetInterface(iname);
}
itype
auront le type d'interface pour la méthode d'implémentation. Cela ne fonctionnera qu'avec des implémentations d'interface explicites, mais c'est exactement ce dont j'ai besoin. Maintenant, je peux utiliser itype
pour interroger les attributs attachés au type d'interface réel.
Merci à tous pour votre aide.
Ah! C'est tout, merci. Je regardais seulement les propriétés, et je ne pensais pas à regarder les méthodes. Je pense 'GetInterfaces()' est ce que je peux utiliser. Je vais utiliser 'method.Name' qui me donne' InterfaceReflection.IFoo.Test', je vais sortir le "IFoo", et utiliser 'GetInterface()' pour trouver son type correspondant. Ça marche. – scobi
Si Foo implémentait plus d'une interface, alors vous auriez encore à déterminer à laquelle la méthode appartient ... Plus que faire si Test n'était pas défini dans l'interface, et était une méthode réelle de Foo? – CodingWithSpike
@ rally25rs: Vous pouvez exécuter i.GetMethods() et faire correspondre le résultat de GetFrame (0) .GetMethod() – Kyte