【问题标题】:Iterate objects in assemblies that implements generic interface迭代实现通用接口的程序集中的对象
【发布时间】:2014-08-17 02:30:23
【问题描述】:

我的程序集中有以下界面

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

【问题讨论】:

  • 好吧,这听起来可行。到目前为止你已经走了多远?哦,你还需要支持class ThirdClass&lt;T&gt; : IGenericInterface&lt;T, Cow&gt;吗?
  • 你的问题是什么?
  • 到目前为止我可以很容易地说: var resolver = Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsAssignableFrom(typeof (ITypeConverter)));但是集合是空的

标签: c# generics reflection


【解决方案1】:

试试这个:

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. 在控制台上写入

【讨论】:

  • 完美就是我的意思
  • 在没有任何解释的情况下复制和粘贴代码的答案可能有助于 OP 解决他们当前的问题,但可能无法帮助他们理解如何解决这个问题和类似问题。对于未来有类似但不同问题的访问者来说更是如此,他们根本无法从复制粘贴答案中受益。
  • 我真的认为代码已经很清晰并且可以自我解释了。无论如何,我添加了您要求的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2010-10-05
  • 2015-05-13
  • 2011-12-19
  • 1970-01-01
  • 2011-11-14
相关资源
最近更新 更多