Как использовать (Switch) вместо (IF & Else) в этом примере метода - PullRequest
1 голос
/ 04 декабря 2011

У меня есть метод многих if and else. Как я могу преобразовать это Switch?

protected override IRepository<T> CreateRepository<T>()
{
   if (typeof(T).Equals(typeof(Person)))
      return new PersonRepositoryNh(this, SessionInstance) as IRepository<T>;
   else if (typeof(T).Equals(typeof(Organization)))
      return new OrganizationRepositoryNh(this, SessionInstance) as IRepository<T>;
   else
      return new RepositoryNh<T>(SessionInstance);
}

Ответы [ 4 ]

2 голосов
/ 04 декабря 2011

Вы не можете.case операторы для switch должны быть константами времени компиляции, типа sbyte, byte, short, ushort, int, uint, long, ulong, char, string или enum-type (включая неявные преобразования),и это не то, что вы имеете с Type объектами.

Что является законным:

switch (foo)
{
    case 42:
       // code
       break;
}

Что не является законным:

int value = GetValue(); // not a verifiable compile-time constant

switch (foo)
{
     case value: 
         // code
         break;
}
2 голосов
/ 04 декабря 2011

В соответствии со спецификацией в выражении switch могут использоваться только sbyte, byte, short, ushort, int, uint, long, ulong, char, string или enum-типы, поэтомув принципе, вы не можете включить объект type.

Теперь, что вы можете сделать, это включить Name типа, это просто string, и его можно включить.

2 голосов
/ 04 декабря 2011

Нельзя использовать оператор switch для типа Type.Вы можете использовать переключатель только с bool, char, string, натуральным и enum или их версиями, допускающими обнуление.

Для компилятора:

Выражение переключателя или метка регистрадолжен быть типом bool, char, string, целочисленным, enum или соответствующим обнуляемым типом

1 голос
/ 04 декабря 2011
  1. Вы уверены, что хотите сделать это так?Почему бы не использовать иерархию объектов и виртуальные функции?

  2. этот код работает

public static void CreateTest<T>()
{
    switch (typeof(T).Name)
    {
        case "Int32": System.Console.WriteLine("int");
            break;
        case "String": System.Console.WriteLine("string");
            break;

    }

}

static void Main(string[] args)
{
    CreateTest<int>();
    CreateTest<string>();
    CreateTest<double>();

}
...