我可以使用动态访问显式实现的属性吗?

时间:2014-02-24 11:02:08

标签: c# .net dynamic reflection duck-typing

我有以下用例。 ISpecificInterface具有SpecificProperty属性的接口由SpecificInterfaceImplementation类显式实现。我的代码实现了传递object的回调,该回调引用了SpecificInterfaceImplementation实例。问题变得更糟 - 有几个不同版本的ISpecificInterface,每个SpecificProperty都有dynamic可能的相同类型(属性),我的程序需要使用它们中的任何一个,最好没有代码重复。

我通过C#dynamic theInterface = theObjectPassed; String propertyValue = theInterface.SpecificProperty;

使用鸭子打字
RuntimeBinderException

但是由于该属性已明确实现,我将Type objectType = theObjectPassed.GetType(); var specificInterface = objectType.GetInterface("SpecificInterface"); var specificProperty = specificInterface.GetProperty("SpecificProperty"); var propertyValue = specificProperty.GetValue(specificInterface); 带有以下文本

  

'SpecificNamespace.SpecificInterfaceImplementation'不包含'SpecificProperty'的定义

所以我需要以某种方式进入界面。我不会使用强制转换,因为强制转换会暴露特定版本的界面,并且仅适用于该版本,并且鸭子打字将会消失。所以我直接使用Reflection:

dynamic

它工作得很好,但需要大量的额外代码。

我可以以某种方式使用{{1}}和鸭子打字以避免使用反射这么多代码吗?

1 个答案:

答案 0 :(得分:0)

我没有使用C#的dynamic功能,但是,根据我所知道的和我在代码中看到的内容,您应该能够访问SpecificProperty的{​​{1}} 1}},因为它是明确声明的。

我的两分钱:使用Reflection,实现了同样的任务,我没有看到更多的代码行保存(从1行到4行)。

编辑:通过一些研究,我发现你的代码很好(我认为它也完美编译,因为动态引用在运行时被解析),这可能是{ {1}}功能,如case中所述。