使用动态对象与创建该对象的类相比有什么优势?

5
我想先声明我并没有经常使用动态对象,最近才遇到了这个问题。我有一个具体的场景要解释,但我想知道实现动态对象相比于创建对象类的优势是什么。
我有一个方法需要将动态对象作为参数。出于长度考虑,我不会贴太多代码,只会贴足以阐明观点的代码。
public static Tax GetEmployeeTax(string Id, Employee employee, dynamic inputObject)
{
var temp = new Employee();
//use the dynamic object properties
return temp;
}

在这种情况下,inputObject将具有帮助识别雇员税收的属性,而这些属性并不直接与雇员类相关。主要是我已经赋予了inputObject以下属性:
dynamic dynamicEmployeeTax = new ExpandoObject();
dynamicEmployeeTax.FederalTaxInfo = "Some information";
dynamicEmployeeTax.StateTaxInfo = "Some other information";

相较于使用动态对象,把它作为自己的类有什么优势?两种方法各有哪些好处?


3
通常情况下,你会选择dynamic,因为你需要。有什么原因你不能为inputObject创建一个类型? - haim770
2
如果你为它创建一个类,那么你将获得强类型和编译时与运行时错误。 - juharr
1
同意@haim770的观点,如果您从某些外部源消耗对象,需要能够接受具有一些共享属性但不实现接口或参与某些继承关系且不能更改的不同对象,则使用dynamic作为最后的选择,而非首选(或者,如果您只是懒得创建一个类-但最终这可能会回来咬你)。 - Matt Burland
1
@haim770 我的第一反应是创建一个类,但是出于这个方法的目的,业务逻辑决定它必须是一个动态对象。个人认为将其作为一个对象更有意义,但这样做的原因是基于简单性。我发帖是想看看是否有其他好处/缺点。 - rocat
1
@rocat,如果“这样做的原因是基于简单性”,那么强类型对象会更加简单。特别是对于将要使用此方法的开发人员来说(以及CLR也是如此,但通常不应该让您烦恼)。 - haim770
显示剩余3条评论
1个回答

1
有几个原因让您想要创建一个类:
  • 强类型利用编译器确保正确性。
  • 封装数据的每个类都像一个合同。您可以通过检查类来想象它的用途。
  • 您强迫在您之后的人阅读如何工作。阅读类属性并想象其实用性更简单。
  • 这是规划和工程的糟糕信号。您正在创建数据块而不是解决特定问题的结构化数据集。想象泥坑与乐高积木。

列表无限延伸。我认为这里的共识是要避免使用它。极少数情况下,这是有用的。对于大多数人来说,应坚持契约并编写抽象而非实现细节的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接