代码之家  ›  专栏  ›  技术社区  ›  Anindya Chatterjee

如何从程序集中提取泛型类型?

  •  0
  • Anindya Chatterjee  · 技术社区  · 14 年前

    我这里有个特别的问题。我想提取一些泛型类型,它从程序集实现泛型接口。我可以累积程序集中的所有类型,但无法从该类型集合中搜索特定的实现类型。这是我正在使用的代码,你能指出它有什么问题吗?或者我怎样才能达到目标?

    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);
            }
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Anton Tykhyy    14 年前
    static void Test<T> ()
    

    你不需要 T 在你的主要职能声明中。 Type 实例只有在类型相同时才相等,而不是在一种类型可转换为另一种类型或实现另一种类型时。假设您想找到实现 ITest<> 具有 任何 参数,此检查应起作用:

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