перегрузка метода и динамическое ключевое слово в C#

#.net #dynamic #c#-4.0

#.net #динамический #c #-4.0

Вопрос:

Я все еще не обновился до 4.0, иначе я бы сам проверил фрагмент кода. Но я надеюсь, что какой-нибудь эксперт сможет прокомментировать это.

В следующем коде будет ли вызываться соответствующий 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");
}
  

Спасибо!

Комментарии:

1. Как бы вы хотели, чтобы это решало, какую печать вызывать? Я думаю, вам было бы лучше прочитать больше о dynamic .

2. во время выполнения, конечно. Спасибо за ваш совет, я это уже делаю! 🙂

3. Это действительно работает, но будьте осторожны с dynamic. Это может решить множество проблем и одновременно доставить вам массу головной боли 🙂 по сути, вы получаете гибкость во время выполнения, но теряете все время компилятора на проверку.

Ответ №1:

Да, это действительно работает. Это проверит использование dynamic во время выполнения и вызовет соответствующий метод, однако вы потеряете почти всю проверку во время компиляции, поэтому я бы удостоверился, что это действительно то, что вы хотели бы сделать.

Комментарии:

1. Спасибо, Джеймс. Код, который я пытаюсь преобразовать, содержит вызовы методов глубиной 3-4 уровня с передачей параметров объекта в штучной упаковке. Я думал о написании перегруженных методов, но это похоже на некоторую логику if-else, затем на вызов метода, больше логики if-else, чем на другой вызов метода (передача того же параметра объекта, который он получает с 2-3 уровней вверх)…. Своего рода боль в шее от устаревшего кода. Где-то внизу он проверяет, является ли объект ArrayList или HashTable или бла-бла-бла, и действует соответствующим образом.

Ответ №2:

Да, и вы даже можете сделать это:

 public dynamic InstantiateAsStringOrDouble() { return 0.5; }
  

или

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

и это будет работать так, как ожидалось.

Комментарии:

1. И, конечно, public dynamic ... { return true; } , вероятно, не сработает.