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!
5 answers
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.
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));
}
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.aspxCaso 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.
string fullName = typeof(MyObj).FullName;
switch (fullName)
{
case "fullName1":
case "fullName2":
case "fullName3":
}
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.
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
}