如何动态确定类型是不是是使用反射的接口?

Posted

技术标签:

【中文标题】如何动态确定类型是不是是使用反射的接口?【英文标题】:How to determine dynamically if type is an Interface using reflection?如何动态确定类型是否是使用反射的接口? 【发布时间】:2015-08-08 18:35:24 【问题描述】:

对于初学者,这个问题不是重复我阅读了 100 次的这篇文章(请继续阅读问题):How to determine if a type implements an interface with C# reflection

我正在使用反射在运行时动态地迭代对象的属性以操作和添加数据。对我来说,根本问题自然是,您不能实例化 Interface 的实例,因此我在下游使用 Activator.CreateInstance 的代码不得针对发现的类型运行是 InterfaceInterface 类型的集合。

假设我在 Person 课程中有以下内容:

public IList<Address> addresses1 get ; set; \\ This property **should** flag being an Interface public List<Address> addresses2 get ; set; \\ This property **should NOT** flag being an Interface

在反映属性时使用以下代码我可以找出该属性是否实现Interface

propertyTypeFromReflection.GetInterfaces().Any()

我遇到的问题是IList&lt;Address&gt;List&lt;Address&gt; 都有上面的语句返回true。这是因为即使是我们所知道的 List&lt;T&gt; 实际上也实现了一系列接口(即 IListICollectionIEnumerable 等)。

由于我是动态进行这项调查的,我不知道如何测试我的类型是否实现了 特定 Interfaceall 示例显示,例如我在开头发布的链接执行以下操作:

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

我需要帮助确定对象属性是否动态反映在焦点上,直接是接口而不是具体类型?所有示例都需要将已知的Interface 测试为已知的具体类型,但由于这是动态发生的,我不知道如何实现这一点?

【问题讨论】:

Type.IsInterface property? 您阅读文档了吗? @SLaks - 感谢您的质量帮助。它确实帮助我解决了这个问题。 【参考方案1】:

您可以使用Type.IsInterface 属性 https://msdn.microsoft.com/en-us/library/system.type.isinterface(v=vs.110).aspx

【讨论】:

通过树木看不到森林的情况 - 这非常有效。在我这个非常工作的人对 C# 反射的了解中,我显然错过了这一点。

以上是关于如何动态确定类型是不是是使用反射的接口?的主要内容,如果未能解决你的问题,请参考以下文章

Java反射机制

反射与代理

使用反射确定 .Net 类型在内存中的布局方式

Golang 反射

反射机制

Java中为什么需要反射?反射要解决什么问题?