对于声明接受匿名对象作为其参数的方法,是否有任何指导原则
本文关键字:方法 参数 是否 原则 任何指 声明 于声明 对象 | 更新日期: 2023-09-27 17:50:36
我想编写一个接受匿名对象作为参数的方法。当声明这样的方法时,参数应该声明为object
还是dynamic
?
-
public static void DoSomethingWith(dynamic details) { }
或 -
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
可能会避免一些复杂性——但基本上object
和dynamic
都是作为object
实现的,直到你开始访问成员。
一般来说,如果你将一个裸object
传递给一个方法,你会期望这个方法检查它,也许是通过反射。对于这些目的,object
将绝对没问题,并且提供直接访问.GetType().GetProperties()
等而不需要任何间接访问。
基本上:如果没有更多关于你在方法内部所做的事情的上下文,就不可能得出"更好"或"更合适"的结论,并且在方法dynamic
和object
中的是微不足道的可互换的(在任何方向上,转换总是成功的)。
在这种情况下,使用dynamic
比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()
之类的代码,使用和阅读更麻烦,而没有提供任何真正的优势。