views:

38

answers:

1

I have a peculiar problem here. I want to extract some generic types, which implements a generic interface from an assembly. I can accumulate all the types from the assembly but can not search for a particular implemented type from that type collection. Here are my code I am using, can you please point out what is the wrong with it? Or how can I achieve the goal?

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);
        }
    }
}
+2  A: 
static void Test<T> ()

You don't need T in the declaration of your main function. Type instances are equal only if types are the same, not if one type is convertible to the other or implements the other. Supposing you want to find all types which implement ITest<> with any argument, this check should work:

if (type == typeof (ITest<>) ||
    Array.Exists   (type.GetInterfaces (), i => 
        i.IsGenericType &&
        i.GetGenericTypeDefinition () == typeof (ITest<>))) // add this type
Anton Tykhyy
I think there is a problem in Linq expression, you can't use i in Contains, as i is not a delegate its a Type object, right?
Anindya Chatterjee
Have to use --Any-- instead of --Contains--. But thanks a lot anyway for giving me the pointers.
Anindya Chatterjee
Fixed — I used my own extension method without thinking (too convenient). Yes, use `Any` or `Array.Exists`
Anton Tykhyy