2012-02-14 35 views
4

请原谅例子。我有一个编码器返回一个接口。取而代之的是使用“is”和“as”来获得实现该接口的对象,我想使用dynamic来访问该对象的 字段 属性。 字段 属性不在接口上,但在实现该接口的所有对象中是共同的。这是一个合理的方式来使用C#动态?

编辑:我还应该提到,我没有控制编码器或它的接口,所以我不能修改它们。

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; } 
}  
+2

如果它在所有对象中都很常见,为什么它不是界面的一部分? – 2012-02-14 22:03:09

+1

IMO使用'dynamic'的唯一原因是与构建在DLR上的语言(如IronPython)互操作。 – 2012-02-14 22:03:35

+0

是否有某些原因导致您无法修改接口以包含所有实现它的类所共有的成员? '动态'似乎是错误的东西在这里使用(虽然是的,它的工作原理) – 2012-02-14 22:04:02

回答

4

这不是一个很好的例子。如果接口的所有(或多个)实现都具有该字段,则使用该字段创建接口的抽象实现,让实现从抽象类派生而不是继承接口。然后你可以使用抽象类而不是接口。

0

在您提到的特定情况下,听起来像属性应该是接口的成员。

3

该使用将工作得很好。 dynamic绑定将查看类型并查找基础属性。从这个角度来看,这是有效的。

但是,如果它是一个通用于接口的所有实现的属性,那么为什么不只是将它添加到接口?如果这是一个你不愿意公开的财产,那为什么不有第二个包含财产的内部界面?

+0

当然,你不能添加一个字段到界面,但我仍然同意你的看法......将字段变成一个属性并放入界面。 – 2012-02-14 22:05:48

+0

@DBM在这种情况下,虽然它是一个属性。更新我的答案以使用一致的术语。 – JaredPar 2012-02-14 22:06:31

+0

OP确实有效,但不是“合理”吗? – 2012-02-15 00:13:04

0

为什么不添加BlahITest?那是:

public interface ITest 
{ 
    public string Blah { get; set; } 
} 
1

是的,这是可以接受的,并会编译。但是,这在我看来感觉像是反模式。当你有一天在课堂上重新命名Blah属性时会发生什么?当然,它会编译,但...

注意:从您的编辑,我明白你不能将属性添加到ITest。因此,我将使用Test实现的属性创建一个新的接口“ITest2”,并让编译器为您完成工作。

相关问题