Как извлечь универсальные типы из сборки? - PullRequest
0 голосов
/ 16 августа 2010

У меня здесь особая проблема.Я хочу извлечь некоторые универсальные типы, которые реализуют универсальный интерфейс из сборки.Я могу накапливать все типы из сборки, но не могу искать конкретный реализованный тип из этой коллекции типов.Вот мой код, который я использую, пожалуйста, укажите, что с ним не так?Или как мне достичь цели?

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 Ответ

2 голосов
/ 16 августа 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...