迭代实现通用接口的程序集中的对象

时间:2014-06-26 09:37:09

标签: c# generics reflection

我的程序集中有以下界面

IGenericInterface<T1, T2>

和一些实施此界面的人员

class FirstClass : IGenericInterface<Cat, Dog>
class SecondClass : IGenericInterface<Horse, Cow>

我需要使用反射

来写这样的东西
for each class that implements IGeiericInterface<,>
Console.WriteLine("Class {0} implements with {1}, {2}")

,输出应为

Class FirstClass implements with Cat, Dog
Class SecondClass implements with Horse, Cow

1 个答案:

答案 0 :(得分:0)

试试这个:

var assembly = Assembly.GetExecutingAssembly(); //or whatever else

        var types =
            from t in assembly.GetTypes()
            from i in t.GetInterfaces()
            where i.IsGenericType && i.GetGenericTypeDefinition().Equals(typeof(IFoo<,>))
            select new 
            {
                Type = t,
                Args = i.GetGenericArguments().ToList()
            };

        foreach (var item in types)
        {
            Console.WriteLine("Class {0} implements with {1}, {2}", item.Type.Name, item.Args[0].Name, item.Args[1].Name);
        }

更新: 根据评论者的要求,对代码的作用进行一些总结。

  1. 提取程序集公开的所有类型
  2. 提取由这些类型实现的所有接口
  3. 仅采用实现指定开放通用接口的那些类型
  4. 选择那些类型以及关闭泛型类型的类型参数
  5. 在控制台上书写