如何在运行时确定是否实现了接口成员?

时间:2013-01-16 18:48:09

标签: c# interface implementation

我有一个名为IStructuredReader的接口,它从文件中读取一些结构化数据并以表格形式显示。它有一个名为Sync()的成员,在实现时会扫描数据以获取用户指定的数据模式。

IStructuredReader的某些实现没有同步功能。这些实现为NotImplementedException方法抛出Sync()。我希望能够检查这个方法是否正在实现,这样我就可以将窗体上的按钮调暗,如果不是的话。

我可以想到一些可以做到这一点的方法,所有这些方法看起来都很笨拙和复杂:

  1. Sync方法分离到自己的接口中,为那些支持该功能的实现继承它,并尝试将reader对象强制转换为它以识别该功能,

  2. 写一个NotImplementedAttribute,用它装饰成员,并使用Reflection检查属性的存在,

  3. 在界面中添加HasSyncCapability布尔属性。

  4. 这是否有规范的方法?

2 个答案:

答案 0 :(得分:6)

这听起来你真的应该有两个接口。您的Sync()方法显然在基础界面上添加了功能,这表明这实际上是一个单独的问题,因为它不是IStructuredReader的要求。我建议为支持此类型的类型添加第二个接口,然后在视图层中轻松检查。

答案 1 :(得分:2)

规范的方法是让接口公开将要实现的方法,因此我看到的最简洁的解决方案是使用该方法创建另一个名为maybe Syncronizable的接口。如果你的对象实现了那个接口你知道方法就在那里,这根本就不笨拙。使用反射或额外属性确实不如解决方案那么干净,但这并不意味着如果它让你的生活更轻松就不应该去那些;)