C# 确定类是否在不引用接口的情况下实现接口

C# 确定类是否在不引用接口的情况下实现接口,c#,C#,我觉得这应该是很有可能的 我有一个接口,我们称之为IJerry。现在,我有一个变量x中的类。该类完美地实现了IJerry。问题是,这个类从来没有引用过IJerry。它恰好有一个完美的、符合IJerry要求的签名 有道理吗?假设您创建了一个名为MyClass的类,该类实现INotifyPropertyChanged。然后从类中删除“MyClass:INotifyPropertyChanged”声明,但将实现留在类中 有没有一种方法可以确定类是否“实现”了一个接口,即使它没有显式引用它?不容易 您必

我觉得这应该是很有可能的

我有一个接口,我们称之为IJerry。现在,我有一个变量x中的类。该类完美地实现了IJerry。问题是,这个类从来没有引用过IJerry。它恰好有一个完美的、符合IJerry要求的签名

有道理吗?假设您创建了一个名为MyClass的类,该类实现INotifyPropertyChanged。然后从类中删除“MyClass:INotifyPropertyChanged”声明,但将实现留在类中

有没有一种方法可以确定类是否“实现”了一个接口,即使它没有显式引用它?

不容易

您必须使用反射读取接口的字段、方法和属性,然后检查类是否有这些字段、方法和属性(再次使用反射)


或者,如果您使用的是C#4,您可以忘记IJerry,将MyClass放入动态变量中,然后在运行时C#确定它是否有被调用的方法。

您必须使用反射来查看x是否有与IJerry上的方法匹配的方法。真正的问题是,你打算如何处理这个答案?在版本4之前,C#不支持“duck-typing”,因此,为了在需要IJerry的地方使用类,您必须编写适配器代码。

实现一个接口的内容远远不止这些。首先,实现方法是虚拟的,即使您不使用该关键字。事实上,你不允许使用那个关键词。另一方面,编译器重新排列方法以匹配接口的方法表布局。从声明中删除继承的接口肯定会使结果不兼容。这些方法将不再是虚拟的


您所追求的是“动态调度”。在DLR中实现,并集成到.NET 4.0和C#4.0语言中。重新发明系统。反射代码并使其高效是一项重大任务。

C#不支持duck键入:@Kirk,检查链接中包含的信息。@Anthony,哦,我明白了。本文提到使用动态关键字作为替代。依我看,这不是“duck类型”,因为它没有提供在满足该契约的“类”类型上进行一般操作的方法。它只允许你“尝试”调用方法,如果它存在的话。我不能接受不是解决方案或答案的答案。但我明白你的意思,我会再复习一遍。C#4可以做动态打字。也可以调用反射的方法。Darn。我希望这是可能的。