首页 / .NET / 正文

[C#].NET/C#程序开发中使用反射如果检测一个类型是否实现了一个接口?

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

问题描述

在.NET/C#的程序开发中,反射中是否提供了一些用以检测指定的类型System.Type是否实现了某个接口的方法呢?比如有如下的接口和实现:

public interface IMyInterface {}
public class MyType : IMyInterface {}

方案一

你可以使用IsAssignableFrom来实现,如:

typeof(IMyInterface).IsAssignableFrom(typeof(MyType))

或者使用GetInterfaces方法,如:

typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))

方案二

创建一个静态扩展方法,然后使用GetInterfaces()方法,如:

public static bool ImplementsInterface(this Type type, Type ifaceType ) {
   Type[] intf = type.GetInterfaces();
   for ( int i = 0; i < intf.Length; i++ ) {
        if ( intf[ i ] == ifaceType ) {
            return true;
        }
    }
    return false;
}

方案三

创建类型帮助类或者类型类型静态方法,如:

public static class TypeHelpers
{
    public static Boolean IsAssignableTo(Type type, Type assignableType)
    {
        return assignableType.IsAssignableFrom(type);
    }

    public static Boolean IsAssignableTo<TAssignable>(Type type)
    {
        return TypeHelpers.IsAssignableTo(type, typeof(TAssignable));
    }
}

public static class TypeExtensions
{
    public static Boolean IsAssignableTo(this Type type, Type assignableType)
    {
        return TypeHelpers.IsAssignableTo(type, assignableType);
    }

    public static Boolean IsAssignableTo<TAssignable>(this Type type)
    {
        return TypeHelpers.IsAssignableTo<TAssignable>(type);
    }
}

调用方法:

var isTrue = michelleType.IsAssignableTo<IMaBelle>();

方案四

var type = typeof(MyType);
var implementsInterface = typeof(IMyInterface).IsAssignableFrom(type) && type.IsClass;

或者查询所有实现了接口的类型的方法:

var implementations = typeof(TypeInTargetAssembly).Assembly.GetTypes()
                          .Where(t => typeof(IMyInterface).IsAssignableFrom(t) && t.IsClass);

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [.NET/C#].NET/C#程序开发中判断一个文件夹是否存在,不存在则创建的方法如何实现?

下一篇: [C#].NET/C#程序开发中获取Lambda表达式中属性名称的方法有哪些呢?

本文永久链接码友网 » [C#].NET/C#程序开发中使用反射如果检测一个类型是否实现了一个接口?

分享扩散:

发表评论

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