6

为了在 c# 中创建干净的解耦代码,我希望获得一些关于使用动态参数构造对象的反馈。通常我相信你会创建一个接口并将接口用作合同,但是你必须为你所有的类创建接口,我认为这有点恶心......

所以,我的问题是做这样的事情有什么好处和坏处:

class Class1
{
    public string Description { get; set; }
    public string Name { get; set; }

    public Class1(dynamic obj)
    {
        Name = obj.Name;
        Description = obj.Description;
    }
}

对比

class Class1
{
    public string Description { get; set; }
    public string Name { get; set; }

    public Class1(IClass1 obj)
    {
        Name = obj.Name;
        Description = obj.Description;
    }
}
4

2 回答 2

8

界面优点:

  • 如果您使用了错误的参数类型,编译器会告诉您
  • 构造函数的签名告诉您参数需要什么

优点dynamic

  • 您不需要声明接口或实现它
  • 具有 Name 和 Description 属性的现有类无需更改即可使用
  • 如果匿名类型具有 Name 和 Description 属性,则可以在同一程序集中使用它们

就我个人而言,我通常使用 C# 作为静态类型语言,除非我正在与自然动态的东西进行交互(例如,我会使用反射,或者调用 COM 或 DLR)......但我可以看到在某些情况下这可能有用。只是不要过度这样做:)

于 2011-05-25T17:29:37.790 回答
1

在这两种情况下,要使方法按预期正常运行,传递给方法的对象必须具有您的 Name 和 Description 属性。

我担心的是,使用动态的最佳实践是,您需要提供额外的方法文档,以确保其他程序员甚至您自己在六个月后知道被传递的对象上必须存在的预期数据协定,甚至那么你真的应该在你的方法中写入错误处理,以确保它在合约被破坏时按预期运行。

所有这些潜在的问题是否都比不编写接口的假设收益更重要,在给出的示例中,接口实际上只有 5 行基本代码,然后它会做所有你强迫自己手动做的事情。

假设您想要遵循最佳实践,这些实践会导致有据可查且易于阅读的代码。为此,我倾向于使用界面。

于 2011-05-25T18:58:07.407 回答