1

我想编写一个接受匿名对象作为参数的方法。在声明这样的方法时,参数应该声明为objectordynamic吗?

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

我的应用程序是一个面向 .NET 4.0 的独立应用程序。

我似乎更喜欢 1 的一个原因是,当您看到显示方法签名的 IntelliSense 提示时,dynamic参数比object.

除非有更好的理由选择 2,否则我会坚持使用 1。

您对此有何经验?

4

3 回答 3

1

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

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

并称它为:

DoSomethingWith(new { X = "ABC", Y = 10 });
于 2013-01-03T10:37:07.273 回答
0

这在很大程度上取决于上下文。显示了两个现有答案,讨论了dynamic允许访问成员的功能,但是那里存在一个巨大的问题,即调用者并不明显它们旨在提供这些成员。在这些情况下,具有这些成员的类型几乎在所有情况下都是首选。

总的来说,of 的使用dynamic应该仅限于您实际需要它的那些场景(与动态类型交谈)。如果您实际上是在与常规 POCO 对象(可能是匿名类型等)交谈,那么object可能会避免一些复杂情况 - 但从根本上说objectdynamic两者都是在object您开始访问成员之前实现的。

通常,如果您将裸信息传递object给一个方法,您会期望该方法检查它,也许是通过反射。出于这些目的,object绝对没问题,并提供对.GetType().GetProperties()等的直接访问而没有任何间接。

基本上:如果没有更多关于你在方法内部所做的事情的上下文,就不可能得出结论是“更好”或“更合适”,并且方法内部dynamic并且object可以简单地互换(在任何一个方向上,演员总是会成功) .

于 2013-01-03T10:57:06.870 回答
0

在这种情况下, usingdynamic有一些我可以看到的优点object并且没有缺点,所以你的选项 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()类似的方法,使用和阅读更麻烦,但没有提供任何真正的优势。

于 2013-01-03T10:48:34.037 回答