首页 / .NET / 正文

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

6386 发布于: 2018-02-09 读完约需5分钟

问题描述

如题,在.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#程序开发中如何将多行回车/换行符替换成一个字符串?

下一篇: [C#].NET/C#程序开发中将一个字符串集合List<string>连接成一个字符串?

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

分享扩散:

发表评论

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