我觉得这应该是非常可能的。
我有一个界面,我们称之为IJerry。现在,我在变量x中有一个类。那个班完美地实现了IJerry。问题是,该课程从未引用过IJerry。它只是发生与IJerry签订完美,合规的签名。
有意义吗?假设您创建了一个名为MyClass的类,它实现了INotifyPropertyChanged。然后从类中删除“MyClass:INotifyPropertyChanged”声明,但是你将该实现保留在类中。
有没有办法确定类是否“实现”一个接口,即使它没有明确引用它?
答案 0 :(得分:7)
不容易。
您必须使用反射读取接口的字段,方法和属性,然后检查类是否具有它们(再次使用反射)
或者,如果你正在使用C#4,你可能会忘记IJerry,并将MyClass放在一个动态变量中,然后你在运行时想出C#,因为它有方法被调用。
答案 1 :(得分:2)
实现界面还有很多其他方面。首先,即使您不使用该关键字,实现方法也是虚拟的。实际上,您不能使用该关键字。另一方面,编译器重新排列方法以匹配接口的方法表布局。从声明中删除继承的接口保证以使结果不兼容。这些方法将不再是虚拟的。
您所追求的是“动态调度”。在DLR中实现并集成到.NET 4.0和C#4.0语言中。重新发明System.Reflection代码并使其高效是一项重大任务。
答案 2 :(得分:1)
您必须使用反射来查看x是否具有与IJerry上的方法匹配的方法。真正的问题是,你打算怎么做答案?在版本4之前,C#不支持“duck typing”,所以为了使用需要IJerry的类,你必须编写适配器代码。