如何确定类型是否使用C#反射实现接口
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;
}
我认为这是正确的版本,原因有以下三个:
- 它使用GetInterfaces而不是IsAssignableFrom,它的速度更快,因为IsAssignableFrom最终在多次检查后都会调用GetInterfaces。
- 它遍历本地数组,因此不会进行边界检查。
- 它使用为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 : interface
说where 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楼
您有几种选择:
typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
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#反射实现接口相关推荐
- VS2013中, 无法嵌入互操作类型“……”,请改用适用的接口的解决方法
使用VS2013,在引用COM组件的时候,出现了无法嵌入互操作类型"--",请改用适用的接口的错误提示. 查阅资料,找到解决方案,记录如下: 选中项目中引入的dll,鼠标右键,选择 ...
- AE开发中“无法嵌入互操作类型*****,请改用适用的接口”解决办法
问题:在AE开发中遇到:"无法嵌入互操作类型*****,请改用适用的接口" 解决办法:在"项目解决方案"中找到"引用",找到报错出现的类对应 ...
- VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
原文:VS2010中,无法嵌入互操作类型"--",请改用适用的接口的解决方法 1.提示:在VS2010,在引用COM组件的时候,出现了无法嵌入互操作类型"--" ...
- java invoke 返回类型_解析Java反射 - invoke方法
最近工作中涉及到获取同程火车票,大概描述为:将本地获取的发出城市,目的城市及出发时间按固定格式封装,调用接口获取可乘坐座席等级最高的火车票,接口返回数据用包含三层类封装的类接受,接受的类总共为四层,倒 ...
- 多方法接口回调_啊?Java反射遇到接口
本文适合有点Java反射基础的同学,在Java反射调用方法时遇到接口参数是一件很蛋疼的事情. 在反射调用方法时需要传参数,像传递基本数据类型进去用就完事,传个对象进去怎么整都没关系,因为你在外部有对象 ...
- Java反射——Type接口详解
目录 Type的简介 Type的获得 Type的分类 1,Class 2,ParameterizedType 3,GenericArrayType 4,WildcardType 5,TypeVaria ...
- 反射feign接口,调用feign的方法
主要是使用了spring的一个反射工具类ReflectionUtils 废话不多说,直接上代码 Fegin接口如下 @FeignClient("sys-service") publ ...
- 【学习笔记】JDBC:java提供的专门操纵数据库的API JDBC驱动程序的类型 JDBC常用的类与接口
JDBC技术 JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口,指定了统一的访问各种关系型数据库的标准接口,JDBC是一种底层的API,因此访问数据库 ...
- 无法嵌入互操作类型“……”,请改用适用的接口的解决方法
选中项目中引入的dll,鼠标右键,选择属性,把"嵌入互操作类型"设置为False.
最新文章
- 北京大学信息科学技术学院招收2022级博士生
- php+date+timezoe,PHP 字符串
- [architecture]-ARM SMMU学习概念总结一篇就够了
- linux哪些端口占用了,如何查看某个端口被谁占用(Linux如何查询哪些端口被占用)...
- tkmybatis 子查询_dnssearch 子域名枚举工具
- GCPC2014 C Bounty Hunter
- Java基础-Java中的内存分配与回收机制
- 统一项目管理平台(UMPlatForm.NET)-4.7 组织机构管理模块
- vue-cli起服务chrome不能打断点——每周汇总(第一周)
- 【MyBatis笔记】05-传统开发模式DAO
- php排课系统设计,基于PHP+MYSQL教务排课系统设计实现论文
- abb机器人写字程序实例_【干货】ABB机器人编程实例一
- android安卓手机变身无线网卡,实现“畅无线“电脑版”台式机笔记本通杀!
- 新浪公司总裁兼首席执行官 曹国伟
- cygwin中安装apt-cyg管理工具注意事项
- 谈谈火车票信息泄漏问题
- 强大便携的多标签文件管理器 XYplorer Pro 21.60 中文版
- 虚拟 DOM 是什么 有什么优缺点
- JavaWeb项目实现163邮箱验证码
- 算法笔记:二叉树,红黑树