[C#].NET/C#程序开发中如何获取实现了某个接口的所有类型列表?

.NET 作者: Rector 394阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

如题,在.NET/C#程序开发中,使用反射如何获取所以实现了某个接口的所有的类型并列举出来(需要的迭代/循环次数最少)?
比如以下的伪代码:

foreach (Type t in this.GetType().Assembly.GetTypes())
    if (t is IMyInterface)
        ; //逻辑处理

方案一

使用lambda表达式和反射IsAssignableFrom()方法,如:

var type = typeof(IMyInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));

方案二

使用linq表达式和反射IsAssignableFrom()方法,如:

var results = from type in someAssembly.GetTypes()
              where typeof(IFoo).IsAssignableFrom(type)
              select type;

方案三

以上方法均使用的IsAssignableFrom,我们也可以使用FindInterfaces,如:

static void Main() {
    const string qualifiedInterfaceName = "Interfaces.IMyInterface";
    var interfaceFilter = new TypeFilter(InterfaceFilter);
    var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    var di = new DirectoryInfo(path);
    foreach (var file in di.GetFiles("*.dll")) {
        try {
            var nextAssembly = Assembly.ReflectionOnlyLoadFrom(file.FullName);
            foreach (var type in nextAssembly.GetTypes()) {
                var myInterfaces = type.FindInterfaces(interfaceFilter, qualifiedInterfaceName);
                if (myInterfaces.Length > 0) {
                    // This class implements the interface
                }
            }
        } catch (BadImageFormatException) {
            // Not a .net assembly  - ignore
        }
    }
}

public static bool InterfaceFilter(Type typeObj, Object criteriaObj) {
    return typeObj.ToString() == criteriaObj.ToString();
}

阅读了该文章的人还浏览了...

本文永久链接码友网 » [C#].NET/C#程序开发中如何获取实现了某个接口的所有类型列表?

发布于: 2018-02-09 14:50:00
分享扩散:

文章评论

获取验证码