这是使用C#动态的合理方式吗

本文关键字:方式吗 动态 | 更新日期: 2023-09-27 18:24:29

原谅这个粗糙的例子。我有一个返回接口的编码器。我不想使用"is"answers"as"来获取实现接口的对象,而是希望使用dynamic来访问对象上的字段属性。字段属性不在接口上,但在实现接口的所有对象中都是通用的。

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

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

这是使用C#动态的合理方式吗

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

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

然而,如果它是接口的所有实现所共有的属性,那么为什么不将其添加到接口中呢?如果它是一个你不想公开的属性,那么为什么不有第二个包含该属性的内部接口呢?

是的,这是可以接受的,可以编译。然而,在我看来,这感觉像是一种反模式。有一天重命名类中的Blah属性时会发生什么?当然会编译,但是。。。

注意:根据您的编辑,我理解您无法将属性添加到ITest。因此,我将使用Test实现的属性创建一个新的接口"ITest2",并让编译器为您完成工作。

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

为什么不将Blah添加到ITest?即:

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