2008-12-27 12 views
2

Donné le:Étant donné un objet, comment puis-je dire par programme quelles interfaces il prend en charge?

Interface IBase {string X {get;set;}} 
Interface ISuper {string Y {get;set;}} 

class Base : IBase {etc...} 
class Super : Base, ISuper {etc...} 

void Questionable (Base b) { 
    Console.WriteLine ("The class supports the following interfaces... ") 
    // The Magic Happens Here 
} 

Que puis-je remplacer "The Magic" avec pour afficher les interfaces prises en charge sur l'objet b?

Oui, je sais en étant de la classe Base, il supporte "IBase", la hiérarchie réelle est plus complexe que cela. :)

Merci! -DF5

EDIT: Maintenant que j'ai vu la réponse, je me sens stupide de ne pas trébucher dessus via Intellisense. :)

Merci à tous! -DF5

+0

Lorsque vous avez la liste d'interface, qu'est-ce que vous allez faire? –

+0

Alimentez-le à une méthode qui sait comment générer des composants d'interface utilisateur (basés sur les interfaces) pour permettre à l'utilisateur de manipuler les valeurs de propriété (via l'interface) de certains objets. IE: Si l'objet prend en charge IDateTimeFormat, alors je dois présenter une liste déroulante des formats de date courants. –

+0

Certains objets possèdent 3 ~ 5 propriétés éditables de l'interface utilisateur ... –

Répondre

8

La magie:

foreach (Type iface in b.GetType().GetInterfaces()) 
    Console.WriteLine(iface.Name); 
2
foreach (var t in b.GetType().GetInterfaces()) 
{ 
    Console.WriteLine(t.ToString()); 
} 
+0

Y a-t-il une bonne raison de préférer le var au type? J'ai tendance à éviter le var autant que possible mais sans bonne justification ... – Diadistis

+0

Diadistis, recherche de "var ou non à var". –

+0

J'utilise toujours var dans les boucles foreach à moins que je ne parcourt une collection qui n'implémente pas IEnumerable . L'appel à "GetInterfaces" rend clair quel type "t" est dans cet exemple, alors pourquoi s'embêter à le répéter dans la déclaration? (IMHO) –

2

Heh, j'ai vu le Console.WriteLine et pensé que vous recherchez une représentation de chaîne. Ici, il est de toute façon

public string GetInterfacesAsString(Type type) { 
    return type.GetInterfaces().Select(t => t.ToString()).Aggregate(x,y => x + "," + y); 
} 
+0

GetInterfaces renvoie toutes les interfaces, pas seulement immédiate. –

+0

Merci, je ne m'en suis pas rendu compte. Je vais mettre à jour la réponse – JaredPar

+0

Ce n'est pas entièrement correct non plus :) Vous devez gérer les interfaces imbriquées, qui doivent être converties de la notation CLR à la notation C#. –