С точки зрения архитектуры, как мне заменить чрезвычайно большой оператор switch на что-то более управляемое?

РЕДАКТИРОВАТЬ 1: Забыл добавить вложенный шарик кривой свойства.

ОБНОВИТЬ: Я выбрал ответ @ mtazva, так как это было предпочтительным решением для моего конкретного случая. Оглядываясь назад, я задал общий вопрос с очень конкретным примером, и я полагаю, что это привело всех (или, возможно, только меня) в замешательство относительно того, что именно было задано. Я верю, что на общий вопрос также был дан ответ (см. Ответы по шаблону стратегии и ссылки). Всем спасибо!

Большие операторы переключателя, очевидно,запах и я видел несколько ссылок о том, как вы могли бы сделать это ссловарь, который отображается на функции, Но мне интересно, есть ли лучший (или умный способ) сделать это? В некотором смысле, это вопрос, который у меня всегда возникал у меня в голове, но у меня никогда не было хорошего решения.

Этот вопрос возник из другого вопроса, который я задавал ранее:Как выбрать все значения свойства объекта в списке типизированных объектов в .Net с C #

Вот пример класса, с которым я работаю (из внешнего источника):

public class NestedGameInfoObject
{
    public string NestedName { get; set; }
    public int NestedIntValue { get; set; }
    public decimal NestedDecimalValue { get; set; }
}

public class GameInfo
{
    public int UserId { get; set; }
    public int MatchesWon { get; set; }
    public long BulletsFired { get; set; }
    public string LastLevelVisited { get; set; }
    public NestedGameInfoObject SuperCoolNestedGameInfo { get; set; }
    // thousands more of these
}

К сожалению, это исходит из внешнего источника ... представьте ОГРОМНЫЙ дамп данных из Grand Theft Auto или что-то в этом роде.

И я хочу получить только небольшое поперечное сечение списка этих объектов. Представьте, что мы хотим сравнить вас с кучей объектов игровой информации ваших друзей. Индивидуальный результат для одного пользователя будет выглядеть так:

public class MyResult
{
    public int UserId { get; set; }  // user id from above object
    public string ResultValue { get; set; }  // one of the value fields from above with .ToString() executed on it
}

И пример того, что я хочу заменить чем-то более управляемым (поверьте мне, я НЕ хочу поддерживать этот оператор переключения монстров):

const int MATCHES_WON = 1;
const int BULLETS_FIRED = 2;
const int NESTED_INT = 3;

public static List<MyResult> GetMyResult(GameInfo[] gameInfos, int input)
{
  var output = new List<MyResult>();

  switch(input)
  {
    case MATCHES_WON:
        output = gameInfos.Select(x => new MyResult()
         {
            UserId = x.UserId, 
            ResultValue = x.MatchesWon.ToString()
         }).ToList<MyResult>();
      break;

    case BULLETS_FIRED:
        output = gameInfos.Select(x => new MyResult()
         {
            UserId = x.UserId, 
            ResultValue = x.BulletsFired.ToString()
         }).ToList<MyResult>();
      break;

    case NESTED_INT:
        output = gameInfos.Select(x => new MyResult()
         {
            UserId = x.UserId, 
            ResultValue = x.SuperCoolNestedGameInfo.NestedIntValue.ToString()
         }).ToList<MyResult>();
      break;

    // ad nauseum
  }

  return output;
}

Так что вопрос в том, есть ли разумные способы управлять этим зверем? Что мне действительно нравится, так это динамический способ получения этой информации в случае изменения исходного объекта (например, добавляются дополнительные свойства информации об игре). Есть ли лучший способ создать это, чтобы он был менее неуклюжим?

Ответы на вопрос(10)

Ваш ответ на вопрос