2009-08-15 2 views
0

У меня есть дерево UGLY-логики, в котором я ищу способы заменить кодом, созданным из таблицы. Разветвляется на основе нескольких вещей:Смешанные типы в логическом дереве в C#

  • длина List<AbstractType>
  • фактических типов в списке
  • а флаги enum

Моя основная идея заключается в том, чтобы построить какое-то дерево решений из таблицы ввода. Для длины списка и флагов это легко (switch), но как насчет типов бит?

This question предлагает, чтобы полиморфизм был хорошей идеей, но это могло бы смешивать проблемы и вставлять код в четыре ветра в моем случае (и в любом случае не дает себе возможности генерировать). Другое предлагаемое решение (IDictionary<Type, DelegateType>) может работать, но кажется немного уродливым.

У кого-нибудь есть предложения.

+0

Если бы вы могли написать, как это выглядит сейчас, это поможет. –

+0

Подумайте о логическом дереве на полпути между тем, что вы видите в The Daily WTF, и что-то, что вы просто пытаетесь избежать и с этим справитесь. Я ищу несколько общих решений, поэтому, если вы хотите больше, вы отвечаете на другой вопрос. – BCS

ответ

1

Одним из способов было бы объединить имена типов (разделенные, например, двоеточием), а затем переключиться по строке, например.

switch(colon_separated_typenames(list)) { 
    case "int:int": //foo 
    case "double:String:double": //bar 
} 
+0

Приятный и чистый +1, но строковое построение и (подозрительные) переключатели немного на медленной стороне. С небольшими усилиями я думаю, что я могу уйти без каких-либо ассигнований. – BCS