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

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

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

问题描述

在.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);

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

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

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

文章评论

获取验证码