使用动态vs接口作为参数的C#构造函数

问题描述

| 为了在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;
    }
}
    

解决方法

界面的优点: 编译器会告诉您是否使用了错误的参数 构造函数的签名告诉您参数需要什么
dynamic
的优点: 您不需要声明或实现接口 具有Name和Description属性的现有类可以直接使用 如果匿名类型具有Name和Description属性,则可以在同一程序集中使用它们 我个人通常将C#用作静态类型的语言,除非我与自然动态的东西进行交互(例如,在其他情况下我将使用反射或调用COM或DLR)...但是在某些情况下我可以看到这一点这可能很有用。只是不要过度做:)     ,在两种情况下,该方法都可以正常工作,传递给该方法的对象必须具有您的Name和Description属性。 我担心的是,使用动态变量的最佳实践是,您将需要提供其他方法文档,以确保其他程序员甚至您自己六个月后才能知道所传递的对象上必须存在的预期数据约定,甚至那么您确实应该将错误处理写入您的方法中,以确保该合同失效时它能够按预期运行。 是否所有这些潜在的误解都使不编写接口的假设收益增加了,在给出的示例中,该接口实际上仅是5条基本代码行,然后将执行您强迫自己手动执行的所有操作。 假设您要遵循最佳实践,这些最佳实践将导致有据可查且易于阅读的代码。我倾向于为此目的使用接口。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...