对于声明接受匿名对象作为其参数的方法,是否有任何指导原则

本文关键字:方法 参数 是否 原则 任何指 声明 于声明 对象 | 更新日期: 2023-09-27 17:50:36

我想编写一个接受匿名对象作为参数的方法。当声明这样的方法时,参数应该声明为object还是dynamic ?

  1. public static void DoSomethingWith(dynamic details) { }
  2. public static void DoSomethingWith(object details) { }

我的应用程序是一个针对。net 4.0的独立应用程序。

我似乎更喜欢1的一个原因是,当您看到显示方法签名的智能感知提示时,dynamic参数比object参数更清楚地说明了它的意图。

我会坚持1,除非有更好的理由去2。

你在这方面有什么经验?

对于声明接受匿名对象作为其参数的方法,是否有任何指导原则

如果你的目标是框架4.0或更高,那么最好使用动态。

public static void DoSomethingWith(dynamic details)
{
    Console.Write(details.X);
    Console.Write(details.Y);
}

并命名为:

DoSomethingWith(new { X = "ABC", Y = 10 });

这很大程度上取决于上下文。有两个现有的答案显示了讨论dynamic允许访问成员的特性,但是存在一个巨大的问题,因为对于调用者来说,它们意味着提供这些成员并不是很明显。在这些情况下,具有这些成员的类型实际上在所有情况下都是首选的。

总的来说,dynamic的使用应该限制在真正需要它的场景中(与动态类型对话)。如果你实际上是在和一个普通的POCO对象对话(可能是一个匿名类型,等等),那么object可能会避免一些复杂性——但基本上objectdynamic都是作为object实现的,直到你开始访问成员。

一般来说,如果你将一个裸object传递给一个方法,你会期望这个方法检查它,也许是通过反射。对于这些目的,object将绝对没问题,并且提供直接访问.GetType().GetProperties()等而不需要任何间接访问。

基本上:如果没有更多关于你在方法内部所做的事情的上下文,就不可能得出"更好"或"更合适"的结论,并且方法dynamicobject中的是微不足道的可互换的(在任何方向上,转换总是成功的)。

在这种情况下,使用dynamicobject有一些优点,没有缺点,我可以看到,所以你的选项1显然是可行的。

选项1允许你使用你的形参,就像你用真正的类型声明它一样(你不能这样做,因为它是匿名的):

public static void DoSomethingWith(dynamic details)
{
  var temp = details.Property; // Correct, as long as the object has a property called Property
}

对于选项2,此代码将是非法的,您将不得不求助于InvokeMethod()之类的代码,使用和阅读更麻烦,而没有提供任何真正的优势。