Это действительно зависит от того, что вы считаете «хорошей идеей».
Это работает и работает довольно элегантно. Он имеет некоторые преимущества и недостатки по сравнению с другими подходами.
На стороне преимущества:
- Это сжато и легко расширяется
- Код довольно прост
За недостатки:
- Проверка ошибок потенциально сложнее, чем классическая реализация посетителя, поскольку вся проверка ошибок должна выполняться во время выполнения. Например, если вы передадите
visitorTest.DynamicVisit(4.2);
, вы получите исключение во время выполнения, но без жалоб на время компиляции.
- Код может быть менее очевидным и иметь более высокую стоимость обслуживания.
Лично я думаю, что это разумный подход. Шаблон посетителя, в классической реализации, имеет довольно высокую стоимость обслуживания и часто трудно протестировать чисто. Это потенциально делает стоимость немного выше, но делает реализацию намного проще.
При хорошей проверке ошибок у меня нет проблем с использованием динамического подхода. Лично я бы, вероятно, использовал такой подход, поскольку альтернативы, которые работают разумным образом, в противном случае становятся довольно неприятными.
Однако есть пара изменений, которые я бы сделал здесь. Во-первых, как я уже говорил, вам действительно нужно включить проверку ошибок.
Во-вторых, я бы на самом деле заставил DynamicVisit
взять dynamic
напрямую, что может сделать (немного) более очевидным, что происходит:
class VistorTest
{
public string DynamicVisit(dynamic obj)
{
try
{
return Visit(obj);
}
catch (RuntimeBinderException e)
{
// Handle the exception here!
Console.WriteLine("Invalid type specified");
}
return string.Empty;
}
// ...Rest of code