C# 我可以使用dynamic访问显式实现的属性吗?
我有以下用例。有一个C# 我可以使用dynamic访问显式实现的属性吗?,c#,.net,dynamic,reflection,duck-typing,C#,.net,Dynamic,Reflection,Duck Typing,我有以下用例。有一个isSpecificInterface接口,它具有SpecificProperty属性,由SpecificInterfaceImplementation类显式实现。我的代码实现了传递给对象的回调,该回调引用了SpecificInterfaceImplementation实例。问题变得更糟了-有几个不同版本的isSpecificInterface每个版本都有SpecificProperty,可能具有相同类型(属性),我的程序需要使用其中任何一个版本,最好不要有代码重复 我会通过
isSpecificInterface
接口,它具有SpecificProperty
属性,由SpecificInterfaceImplementation
类显式实现。我的代码实现了传递给对象
的回调,该回调引用了SpecificInterfaceImplementation
实例。问题变得更糟了-有几个不同版本的isSpecificInterface
每个版本都有SpecificProperty
,可能具有相同类型(属性),我的程序需要使用其中任何一个版本,最好不要有代码重复
我会通过C#动态
使用duck输入:
dynamic theInterface = theObjectPassed;
String propertyValue = theInterface.SpecificProperty;
但由于该属性是显式实现的,因此我得到了RuntimeBinderException
,其中包含以下文本
“SpecificNamespace.SpecificInterfaceImplementation”不包含“SpecificProperty”的定义
所以我需要找到接口。我不会使用强制转换,因为强制转换将公开接口的特定版本,并且只适用于该版本,而duck类型将消失。所以我直接使用反射:
Type objectType = theObjectPassed.GetType();
var specificInterface = objectType.GetInterface("SpecificInterface");
var specificProperty = specificInterface.GetProperty("SpecificProperty");
var propertyValue = specificProperty.GetValue(specificInterface);
它工作得很好,但需要大量额外的代码
我是否可以使用
动态
s和duck键入来避免这一大堆带有反射的代码?我没有太多地使用C#的动态
特性,但是,从我所知道的和我在代码中看到的情况来看,您应该能够访问接口
的属性SpecificProperty
,因为它是显式声明的
我的两分钱:使用反射,完成了相同的任务,我看不到代码行的更多节省(从1行到4行)
编辑:通过一点研究,我发现您的代码很好(我认为它也可以完美编译,因为动态引用在运行时得到解决),这可能是
动态
功能中的一个缺陷,如本文所述。大量代码?4行?拜托…@Alberto:与界面相比差异很大。Specific属性。可能我做错了什么,但它在我的机器上工作得很好,正如我所期望的那样。“动态”是指它所操作的实例的运行时类型,如果它找不到字段,则表示该字段实际上不存在于该类型中。@Tigran:当然,如果运行时类型显式实现该属性,则该属性将不可访问。@Tigran:不,类似这样的内容: