【问题标题】:method overloading and dynamic keyword in C#C#中的方法重载和动态关键字
【发布时间】:2011-04-29 18:39:22
【问题描述】:

我还没有升级到 4.0,否则我会自己检查代码 sn-p。但我希望有专家对此发表评论。

在下面的代码中,是否会在运行时调用适当的Print() 方法?在 C# 2010 中这样称呼它是否合法?

public void Test()
{
    dynamic objX = InstantiateAsStringOrDouble();

    Print(objX);
}

public void Print(string s)
{
    Console.Write("string");
}

public void Print(double n)
{
    Console.Write("double");
}

谢谢!

【问题讨论】:

  • 您希望它如何决定调用哪个 Print?我认为你最好阅读更多关于dynamic的信息。
  • 当然是在运行时。感谢您的建议,我已经这样做了! :-)
  • 它确实有效,但要小心动态。它可以解决很多问题,同时也让你很头疼 :-) 基本上你获得了运行时灵活性,但失去了所有编译器时间检查。

标签: .net dynamic c#-4.0


【解决方案1】:

是的,这确实有效。它将在运行时检查动态的使用情况并调用适当的方法,但是您几乎会丢失所有编译时检查,所以我会确保这确实是您想要做的。

【讨论】:

  • 谢谢詹姆斯。我尝试转换的代码具有 3-4 级深度方法调用,并传递了装箱的 Object 参数。我想过编写重载方法,但它就像一些 if-else 逻辑,然后是一个方法调用,比另一个方法调用更多的 if-else 逻辑(传递从 2-3 级向上获得的相同 Object 参数)......痛苦脖子式的遗留代码。在底部的某个地方,它会检查 Object 是 ArrayList 还是 HashTable 还是 blah blah 并采取相应的行动。
【解决方案2】:

是的,你甚至可以这样做:

public dynamic InstantiateAsStringOrDouble() { return 0.5; }

public dynamic InstantiateAsStringOrDouble() { return "hello"; }

它会按预期工作。

【讨论】:

  • 当然,public dynamic ... { return true; } 可能不起作用。
猜你喜欢
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 2022-10-23
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 2010-09-23
相关资源
最近更新 更多