原谅粗暴的榜样。我有一个返回接口的编码器。而不是使用"而不是#34; " as" as"为了获得实现接口的对象,我想使用dynamic来访问对象上的 field 属性。 字段属性不在接口上,但在实现接口的所有对象中都是通用的。
编辑:我还应该提一下,我无法控制编码器或它的接口,所以我无法修改它们。
public class Program
{
public Program()
{
dynamic temp = GetInterface();
string s = temp.Blah;
temp.Blah = s;
}
private ITest GetInterface()
{
return new Test();
}
}
public interface ITest
{
}
public class Test : ITest
{
public string Blah { get; set; }
}
答案 0 :(得分:4)
这不是一个很好的例子。如果接口的所有(或许多)实现都具有该字段,则使用该字段创建接口的抽象实现,使实现派生自抽象类而不是继承接口。然后你可以使用抽象类而不是接口。
答案 1 :(得分:3)
使用效果会很好。 dynamic
绑定将查看类型并查找基础属性。从这个角度看它是有效的。
但是,如果它是所有接口实现共有的属性,那么为什么不将它添加到接口?如果它是一个你不想公开的属性那么为什么没有包含该属性的第二个内部接口呢?
答案 2 :(得分:1)
是的,这是可以接受的并且会编译。然而,在我看来,这感觉就像一个反模式。当你在课堂上重命名Blah房产时会发生什么?当然它会编译但是......
注意:从您的编辑中,我了解您无法将属性添加到ITest。因此,我将使用Test实现的属性创建一个新的接口“ITest2”,让编译器为您完成工作。
答案 3 :(得分:0)
在您提到的特定情况下,听起来属性 应该是接口的成员。
答案 4 :(得分:0)
为什么不将Blah
添加到ITest
?那就是:
public interface ITest
{
public string Blah { get; set; }
}