【问题标题】:Search an assembly for all child types?搜索所有子类型的程序集?
【发布时间】:2008-11-21 15:14:37
【问题描述】:

我想查找从基/接口继承的所有类型。任何人都有一个很好的方法来做到这一点?想法?

我知道这是一个奇怪的请求,但我一直在玩它。

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    使用 Assembly.GetTypes() 获取所有类型,使用 Type.IsAssignableFrom() 检查继承。如果您需要代码,请告诉我 - 以及您是否使用 .NET 3.5。 (很多像这样的反射任务使用 LINQ to Objects 更简单。)

    编辑:根据要求,这是一个示例 - 它在实现 IEnumerablemscorlib 中找到所有内容。请注意,当基类型是泛型时,生活会有些困难......

    using System;
    using System.Collections;
    using System.Linq;
    using System.Reflection;
    
    class Test
    {
        static void Main()
        {
            Assembly assembly = typeof(string).Assembly;
            Type target = typeof(IEnumerable);        
            var types = assembly.GetTypes()
                                .Where(type => target.IsAssignableFrom(type));
    
            foreach (Type type in types)
            {
                Console.WriteLine(type.Name);
            }
        }
    }
    

    【讨论】:

    • 我很想看到该代码,因为我无法让 Type.IsAssignableFrom() 以我理解的方式工作。我在 3.5 sp1 上。谢谢!
    【解决方案2】:
    var a = Assembly.Load("My.Assembly");
    foreach (var t in a.GetTypes().Where(t => t is IMyInterface))
    {
        // there you have it
    }
    

    【讨论】:

    • 不,那行不通——“is”检查一个object是否实现了一个接口,而“Type”的实例没有实现IMyInterface。这就是我建议使用 Type.IsAssignableFrom 的原因。
    【解决方案3】:

    或者对于基类的子类:

    var a = Assembly.Load("My.Assembly");
    foreach (var t in a.GetTypes().Where(t => t.IsSubClassOf(typeof(MyType)))
    {
        // there you have it
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多