C# ligar o tipo [duplicado]

possível duplicado:
C# - Existe uma alternativa melhor do que esta para 'ligar o tipo'?

O C# não suporta ligar o tipo de objecto. Qual é o melhor padrão de simular isto:

switch (typeof(MyObj))
    case Type1:
    case Type2:
    case Type3:
Obrigado!

 129
c#
Author: Community, 2010-12-18

5 answers

Costumo usar um dicionário de tipos e delegados.
var @switch = new Dictionary<Type, Action> {
    { typeof(Type1), () => ... },
    { typeof(Type2), () => ... },
    { typeof(Type3), () => ... },
};

@switch[typeof(MyType)]();

É um pouco menos flexível porque você não pode cair através de casos, continuar etc. Mas raramente o faço.

 157
Author: Mark H, 2010-12-18 14:51:49

Existe uma resposta simples para esta questão em Switch case no tipo c # que usa um dicionário de tipos para procurar uma função lambda.

Aqui está como ele pode ser usado

    var ts = new TypeSwitch()
        .Case((int x) => Console.WriteLine("int"))
        .Case((bool x) => Console.WriteLine("bool"))
        .Case((string x) => Console.WriteLine("string"));

    ts.Switch(42);     
    ts.Switch(false);  
    ts.Switch("hello"); 
}

Existe também uma solução generalizada para este problema em termos de correspondência de padrões (ambos os tipos e Condições verificadas durante a execução) em switch / pattern matching idea

  var getRentPrice = new PatternMatcher<int>()
        .Case<MotorCycle>(bike => 100 + bike.Cylinders * 10) 
        .Case<Bicycle>(30) 
        .Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20)
        .Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20)
        .Default(0);

    var vehicles = new object[] {
        new Car { EngineType = EngineType.Diesel, Doors = 2 },
        new Car { EngineType = EngineType.Diesel, Doors = 4 },
        new Car { EngineType = EngineType.Gasoline, Doors = 3 },
        new Car { EngineType = EngineType.Gasoline, Doors = 5 },
        new Bicycle(),
        new MotorCycle { Cylinders = 2 },
        new MotorCycle { Cylinders = 3 },
    };

    foreach (var v in vehicles)
    {
        Console.WriteLine("Vehicle of type {0} costs {1} to rent", v.GetType(), getRentPrice.Match(v));
    }
 24
Author: cdiggins, 2017-05-23 10:31:33
É um buraco no jogo do C#, ainda não há bala de prata.

Você deve pesquisar no google sobre o 'padrão de visitantes', mas pode ser um pouco pesado para você, mas ainda assim algo que você deve saber.

Aqui está outra opinião sobre o assunto usando Linq: http://community.bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx

Caso contrário, algo deste género poderia ajudar

// nasty..
switch(MyObj.GetType.ToString()){
  case "Type1": etc
}

// clumsy...
if myObj  is Type1 then
if myObj is Type2 then

Etc.

 9
Author: gjvdkamp, 2017-02-01 17:49:00
Fiz isso uma vez com uma solução, espero que ajude.
string fullName = typeof(MyObj).FullName;

switch (fullName)
{
    case "fullName1":
    case "fullName2":
    case "fullName3":
}
 3
Author: Ghyath Serhal, 2010-12-18 14:42:22

Usei esta forma de switch-case em raras ocasiões. Mesmo assim, encontrei outra forma de fazer o que queria. Se você achar que esta é a única maneira de realizar o que você precisa, eu recomendaria a solução de @Mark H.

Se se pretende que isto seja uma espécie de processo de decisão de criação de fábricas, há melhores maneiras de o fazer. Caso contrário, não percebo porque queres usar o interruptor num tipo. Aqui está um pequeno exemplo expandindo a solução de Mark. Eu acho que é um grande maneira de trabalhar com tipos:
Dictionary<Type, Action> typeTests;

public ClassCtor()
{
    typeTests = new Dictionary<Type, Action> ();

    typeTests[typeof(int)] = () => DoIntegerStuff();
    typeTests[typeof(string)] = () => DoStringStuff();
    typeTests[typeof(bool)] = () => DoBooleanStuff();
}

private void DoBooleanStuff()
{
   //do stuff
}

private void DoStringStuff()
{
    //do stuff
}

private void DoIntegerStuff()
{
    //do stuff
}

public Action CheckTypeAction(Type TypeToTest)
{
    if (typeTests.Keys.Contains(TypeToTest))
        return typeTests[TypeToTest];

    return null; // or some other Action delegate
}
 3
Author: IAbstract, 2010-12-18 15:37:01