我有以下用例。 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}}和鸭子打字以避免使用反射这么多代码吗?
答案 0 :(得分:0)
我没有使用C#的dynamic
功能,但是,根据我所知道的和我在代码中看到的内容,您应该能够访问SpecificProperty
的{{1}} 1}},因为它是明确声明的。
我的两分钱:使用Reflection,实现了同样的任务,我没有看到更多的代码行保存(从1行到4行)。
编辑:通过一些研究,我发现你的代码很好(我认为它也完美编译,因为动态引用在运行时被解析),这可能是{ {1}}功能,如case中所述。