Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以使用dynamic访问显式实现的属性吗?_C#_.net_Dynamic_Reflection_Duck Typing - Fatal编程技术网

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:不,类似这样的内容: