你的位置: 首页 / .NET / 正文

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

1694 收藏 读完约需 1 分钟 发布于: 2018-02-09 14:50

问题描述

如题,在.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#程序开发中如何获取实现了某个接口的所有类型列表?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册