2010-08-16 8 views
0

J'ai un problème particulier ici. Je veux extraire certains types génériques, qui implémente une interface générique à partir d'un assemblage. Je peux accumuler tous les types de l'assembly, mais je ne peux pas rechercher un type implémenté particulier à partir de cette collection de types. Voici mon code que j'utilise, pouvez-vous s'il vous plaît préciser quel est le problème avec? Ou comment puis-je atteindre l'objectif?Comment extraire des types génériques d'un assemblage?

using System.Reflection; 
using System; 
using System.Collections.Generic; 

namespace TypeTest 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
      Test<int>(); 
      Console.ReadKey(true); 
     } 

     static void Test<T>(){ 
      var types = Assembly.GetExecutingAssembly().GetTypes(); 

      // It prints Types found = 4 
      Console.WriteLine("Types found = {0}", types.Length); 

      var list = new List<Type>(); 

      // Searching for types of type ITest<T>  
      foreach(var type in types){ 
       if (type.Equals(typeof(ITest<>))) { 
        list.Add(type); 
       } 
      } 

      // Here it prints ITest type found = 1 
      // Why? It should prints 3 instead of 1, 
      // How to correct this? 
      Console.WriteLine("ITest type found = {0}", list.Count); 
     } 
    } 

    public interface ITest<T> 
    { 
     void DoSomething(T item); 
    } 

    public class Test1<T> : ITest<T> 
    { 
     public void DoSomething(T item) 
     { 
      Console.WriteLine("From Test1 {0}", item); 
     } 
    } 

    public class Test2<T> : ITest<T> 
    { 
     public void DoSomething(T item) 
     { 
      Console.WriteLine("From Test2 {0}", item); 
     } 
    } 
} 

Répondre

2
static void Test<T>() 

Vous n'avez pas besoin T dans la déclaration de votre fonction principale. Type les instances sont égales seulement si les types sont identiques, pas si un type est convertible à l'autre ou implémente l'autre. Supposons que vous voulez trouver tous les types qui mettent en œuvre ITest<> avec aucun argument, cette vérification devrait fonctionner:

if (type == typeof (ITest<>) || 
    Array.Exists (type.GetInterfaces(), i => 
     i.IsGenericType && 
     i.GetGenericTypeDefinition() == typeof (ITest<>))) // add this type 
+0

Je pense qu'il ya un problème dans l'expression Linq, vous ne pouvez pas utiliser i dans FIGURANT que je n'est pas un délégué c'est un objet Type, non? –

+0

Vous devez utiliser --Any-- au lieu de --Contains--. Mais merci beaucoup de me donner les conseils. –

+0

Correction - J'ai utilisé ma propre méthode d'extension sans réfléchir (trop pratique). Oui, utilisez 'Any' ou' Array.Exists' –

Questions connexes