2010-08-27 130 views
3

我觉得这应该是非常可能的。确定一个类是否实现了一个接口而不引用它

我有一个接口,我们称之为IJerry。现在,我在变量x中有一个类。这个类完全实现了IJerry。事情是,那个班从来没有提到IJerry。它只是发生与IJerry拥有完美兼容的签名。

有意义吗?假设您创建一个名为MyClass的类实现INotifyPropertyChanged。然后你从类中删除“MyClass:INotifyPropertyChanged”声明,但是你在类中放置了实现。

有没有办法确定类是否“实现”了一个接口,即使它没有明确的引用它?

+1

C#不支持鸭子打字:http://en.wikipedia.org/wiki/Duck_typing – 2010-08-27 15:21:09

+2

@Kirk,检查链接中包含的信息。 – 2010-08-27 15:24:33

+0

@安东尼,哦,我明白了。该文章提到使用**动态**关键字作为替代品。国际海事组织,这不是“鸭子打字”,因为它不提供一般操作满足该合同类型的“类”的手段。它只是允许你“尝试”调用该方法。 – 2010-08-27 15:54:58

回答

7

不容易。

你将不得不使用反射来读取接口领域,方法和属性,然后检查类有他们(再次使用反射)

另外,如果你使用的是C#4,你可能会忘记IJerry,并将MyClass放入一个动态变量中,然后您在运行时找出C#调用方法。

+0

织补。我希望这是可能的。 – 2010-08-27 20:50:15

1

您将不得不使用反射来查看x是否具有与IJerry上的方法相匹配的方法。真正的问题是,你将如何处理答案?在版本4之前,C#不支持“鸭子打字”,因此为了在需要使用IJerry的情况下使用您的类,您必须编写适配器代码。

+0

C#4可以做动态输入。反射的方法也可以被调用。 – 2010-08-27 15:29:49

2

实现接口比实现目标要多得多。首先,实现方法是虚拟的,即使您不使用该关键字。实际上,您不允许使用该关键字。另一方面,编译器重新排列方法以匹配接口的方法表格布局。从声明中删除继承的接口保证使结果不兼容。这些方法将不再是虚拟的。

你正在追求的是所谓的'动态调度'。在DLR中实施并集成到.NET 4.0和C#4.0语言中。重新制定System.Reflection代码并使其高效是一项重大任务。

相关问题