C# 反射是否提供确定某些给定的System.Type类型是否为某些接口建模的方法?

public interface IMyInterface {}public class MyType : IMyInterface {}// should yield 'true'
typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface);

#1楼

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;
}

我认为这是正确的版本,原因有以下三个:

  1. 它使用GetInterfaces而不是IsAssignableFrom,它的速度更快,因为IsAssignableFrom最终在多次检查后都会调用GetInterfaces。
  2. 它遍历本地数组,因此不会进行边界检查。
  3. 它使用为Type定义的==运算符,因此可能比Equals方法(包含调用最终将使用)更安全。

#2楼

正如其他人已经提到的:本杰明·13年4月10日在22:21”

可以很容易地不注意并向后获取IsAssignableFrom的参数。 我现在就使用GetInterfaces:p –

好吧,另一种方法是创建一个简短的扩展方法,在某种程度上满足“最通常”的思维方式(并同意这是一个很小的个人选择,可以根据个人喜好使其稍微“自然”些) ):

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

为什么不更通用一些(不确定是否真的那么有趣,我想我只是在传递另一撮“语法化”糖):

public static class TypeExtensions
{public static bool IsAssignableTo(this Type type, Type assignableType){return assignableType.IsAssignableFrom(type);}public static bool IsAssignableTo<TAssignable>(this Type type){return IsAssignableTo(type, typeof(TAssignable));}
}

我认为这样可能更自然,但再次只是个人意见的问题:

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

#3楼

修改Jeff的答案以获得最佳性能(感谢Pierre Arnaud的性能测试):

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

要查找在给定Assembly中实现接口的所有类型:

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

#4楼

关于什么

if(MyType as IMyInterface != null)


#5楼

关于什么

typeof(IWhatever).GetTypeInfo().IsInterface

#6楼

我已经做了:

public static bool Implements<I>(this Type source) where I : class
{return typeof(I).IsAssignableFrom(source);
}

我希望我可以在where I : interfacewhere I : interface ,但是interface不是通用参数约束选项。 class就近了。

用法:

if(MyType.Implements<IInitializable>())MyCollection.Initialize();

我刚刚说了Implements因为它更直观。 我总是得到IsAssignableFrom触发器。


#7楼

IsAssignableFrom现在移到TypeInfo

typeof(ISMSRequest).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo());

#8楼

正确的答案是

typeof(MyType).GetInterface(nameof(IMyInterface)) != null;

然而,

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

可能会返回错误的结果,如以下代码所示,字符串和IConvertible:

    static void TestIConvertible(){string test = "test";Type stringType = typeof(string); // or test.GetType();bool isConvertibleDirect = test is IConvertible;bool isConvertibleTypeAssignable = stringType.IsAssignableFrom(typeof(IConvertible));bool isConvertibleHasInterface = stringType.GetInterface(nameof(IConvertible)) != null;Console.WriteLine($"isConvertibleDirect: {isConvertibleDirect}");Console.WriteLine($"isConvertibleTypeAssignable: {isConvertibleTypeAssignable}");Console.WriteLine($"isConvertibleHasInterface: {isConvertibleHasInterface}");}

结果:

 isConvertibleDirect: TrueisConvertibleTypeAssignable: FalseisConvertibleHasInterface: True

#9楼

使用Type.IsAssignableFrom

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

#10楼

typeof(IMyInterface).IsAssignableFrom(someclass.GetType());

要么

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

#11楼

您有几种选择:

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

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

对于通用接口,则有所不同。

typeof(MyType).GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IMyInterface<>))

#12楼

请注意,如果您具有通用接口IMyInterface<T>那么它将始终返回false

  typeof(IMyInterface<>).IsAssignableFrom(typeof(MyType)) /* ALWAYS FALSE */

这也不起作用:

  typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface<>))  /* ALWAYS FALSE */

但是,如果MyType实现IMyInterface<MyType>则可以正常工作并返回true

  typeof(IMyInterface<MyType>).IsAssignableFrom(typeof(MyType))

但是,您可能会在运行时不知道类型参数T 一个有点古怪的解决方案是:

  typeof(MyType).GetInterfaces().Any(x=>x.Name == typeof(IMyInterface<>).Name)

Jeff的解决方案不太灵活:

  typeof(MyType).GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IMyInterface<>));

这是在任何情况下都适用的Type扩展方法:

public static class TypeExtensions
{public static bool IsImplementing(this Type type, Type someInterface){return type.GetInterfaces().Any(i => i == someInterface || i.IsGenericType && i.GetGenericTypeDefinition() == someInterface);}
}

(请注意,上面使用的是linq,它可能比循环慢。)

然后,您可以执行以下操作:

   typeof(MyType).IsImplementing(IMyInterface<>)

#13楼

如果您有类型或实例,则可以轻松检查它们是否支持特定的接口。

要测试对象是否实现特定接口:

if(myObject is IMyInterface) {// object myObject implements IMyInterface
}

要测试一种类型是否实现了某个接口:

if(typeof(IMyInterface).IsAssignableFrom(typeof(MyType))) {// type MyType implements IMyInterface
}

如果您有一个通用对象,并且想要进行转换以及检查您转换到的接口是否已实现,则代码为:

 var myCastedObject = myObject as IMyInterface;if(myCastedObject != null) {// object myObject implements IMyInterface}

如何确定类型是否使用C#反射实现接口相关推荐

  1. VS2013中, 无法嵌入互操作类型“……”,请改用适用的接口的解决方法

    使用VS2013,在引用COM组件的时候,出现了无法嵌入互操作类型"--",请改用适用的接口的错误提示. 查阅资料,找到解决方案,记录如下: 选中项目中引入的dll,鼠标右键,选择 ...

  2. AE开发中“无法嵌入互操作类型*****,请改用适用的接口”解决办法

    问题:在AE开发中遇到:"无法嵌入互操作类型*****,请改用适用的接口" 解决办法:在"项目解决方案"中找到"引用",找到报错出现的类对应 ...

  3. VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法

    原文:VS2010中,无法嵌入互操作类型"--",请改用适用的接口的解决方法 1.提示:在VS2010,在引用COM组件的时候,出现了无法嵌入互操作类型"--" ...

  4. java invoke 返回类型_解析Java反射 - invoke方法

    最近工作中涉及到获取同程火车票,大概描述为:将本地获取的发出城市,目的城市及出发时间按固定格式封装,调用接口获取可乘坐座席等级最高的火车票,接口返回数据用包含三层类封装的类接受,接受的类总共为四层,倒 ...

  5. 多方法接口回调_啊?Java反射遇到接口

    本文适合有点Java反射基础的同学,在Java反射调用方法时遇到接口参数是一件很蛋疼的事情. 在反射调用方法时需要传参数,像传递基本数据类型进去用就完事,传个对象进去怎么整都没关系,因为你在外部有对象 ...

  6. Java反射——Type接口详解

    目录 Type的简介 Type的获得 Type的分类 1,Class 2,ParameterizedType 3,GenericArrayType 4,WildcardType 5,TypeVaria ...

  7. 反射feign接口,调用feign的方法

    主要是使用了spring的一个反射工具类ReflectionUtils 废话不多说,直接上代码 Fegin接口如下 @FeignClient("sys-service") publ ...

  8. 【学习笔记】JDBC:java提供的专门操纵数据库的API JDBC驱动程序的类型 JDBC常用的类与接口

    JDBC技术 JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口,指定了统一的访问各种关系型数据库的标准接口,JDBC是一种底层的API,因此访问数据库 ...

  9. 无法嵌入互操作类型“……”,请改用适用的接口的解决方法

    选中项目中引入的dll,鼠标右键,选择属性,把"嵌入互操作类型"设置为False.

最新文章

  1. 北京大学信息科学技术学院招收2022级博士生
  2. php+date+timezoe,PHP 字符串
  3. [architecture]-ARM SMMU学习概念总结一篇就够了
  4. linux哪些端口占用了,如何查看某个端口被谁占用(Linux如何查询哪些端口被占用)...
  5. tkmybatis 子查询_dnssearch 子域名枚举工具
  6. GCPC2014 C Bounty Hunter
  7. Java基础-Java中的内存分配与回收机制
  8. 统一项目管理平台(UMPlatForm.NET)-4.7 组织机构管理模块
  9. vue-cli起服务chrome不能打断点——每周汇总(第一周)
  10. 【MyBatis笔记】05-传统开发模式DAO
  11. php排课系统设计,基于PHP+MYSQL教务排课系统设计实现论文
  12. abb机器人写字程序实例_【干货】ABB机器人编程实例一
  13. android安卓手机变身无线网卡,实现“畅无线“电脑版”台式机笔记本通杀!
  14. 新浪公司总裁兼首席执行官 曹国伟
  15. cygwin中安装apt-cyg管理工具注意事项
  16. 谈谈火车票信息泄漏问题
  17. 强大便携的多标签文件管理器 XYplorer Pro 21.60 中文版
  18. 虚拟 DOM 是什么 有什么优缺点
  19. JavaWeb项目实现163邮箱验证码
  20. 算法笔记:二叉树,红黑树

热门文章

  1. C++学习笔记(十二):重载函数
  2. 如何解决Backup Exec Remote Agent推送安装失败的问题
  3. 修改域的NetBIOS名称
  4. 转: 如何使用jstack分析线程状态
  5. JQuery学习记录——jQuery对象和DOM对象的转换
  6. 今天心情好,一起探讨下《送给大家的200兆SVN代码服务器》怎么管理我们的VS代码?...
  7. Unity Application Block 发布
  8. Kippo:一款强大的SSH蜜罐工具
  9. Windows下部署elasticsearch和kibana
  10. Linux 服务器为什么被黑