Как я могу перейти к другому аргументу case в состоянии switch-case со значением текущего оператора case?
Возможно ли реализовать подобные вещи с помощью корпуса коммутатора или есть ли другой способ его реализации?
Можно ли достичь? Если нет, то есть ли другой способ его достижения?
Этот код работает:
switch (this.Name)
{
case "":
if (this.Owner == null)
{
goto DoBill;
}
break;
case "Bill":
DoBill:
break;
}
Тем не менее, любой, кто на самом деле это делает, должен быть расстрелян. Или, по крайней мере, говорила очень серьезно. Почему бы просто не сделать разумную вещь?
switch (param.Component.Type)
{
case "Combo":
returnComboItemSelect = generateCB(param);
if(returnComboItemSelect=="Slider")
{
returnSomething = generateSl(param,returnComboItemSelect); //I mean no need to jump
}
break;
case "List":
returnSomething = generateL(param);
break;
case "Slider":
returnSomething
.....
Серьезно, если вы начнете прыгать между заявлениями о случаях, вы не должны их использовать. Я не слишком увлечен кодом выше (дублирование, но иногда...)
Вы могли бы, но в то же время, обойти оператор switch и выйти из цикла, когда все будет готово.
var keepLooping = true;
var switchCaseSwitch = param.Component.Type;
while(keepLooping)
{
switch (switchCaseSwitch)
{
case "Combo":
returnComboItemSelect = generateCB(param);
if (returnComboItemSelect == "Slider")
{
switchCaseSwitch = "Slider";
}
else
{
keepLooping = false;
}
break;
case "List":
returnSomething = generateL(param);
keepLooping = false;
break;
case "Slider":
returnSomething = generateSl(param,1);
keepLooping = false;
break;
case "RadioButtons":
returnSomething = generateRB(param);
keepLooping = false;
break;
case "CheckBox":
returnSomething = generateCHB(param,flag);
keepLooping = false;
break;
default:
throw new Exception("Unknown component type");
}
}
Или вы можете помешать описанию дела и сделать что-то вроде этого:
//Setup
var selector = new Dictionary<string, Func<Param, string, string>>();
selector.Add("Combo", (p, flag) =>
{
var returnComboItemSelect = generateCB(p);
if (returnComboItemSelect == "Slider")
{
return selector["Slider"](p, returnComboItemSelect);
}
return returnComboItemSelect;
});
selector.Add("List", (p, flag) => { return generateL(p); });
selector.Add("Slider", (p, flag) => { return generateSL(p, flag); });
selector.Add("RadioButtons", (p, flag) => { return generateRB(p); });
selector.Add("CheckBox", (p, flag) => { return generateCHB(p, flag); });
//use
var result = selector[param.Component.Type](param, flag);
Я думаю, вам будет намного лучше переосмыслить вашу архитектуру.
Люди не склонны использовать GOTO в С# в эти дни, если они не пытаются разбить вложенные циклы.
for example
foreach(var item in items){
foreach(var name in item.people){
if(name == WhatIAmSearchingFor)
goto found;
}
}
found:
//Your Code
Что-то простое, как возвращение Func, и мешок свойств params - более четкий способ сделать это. Или, как в приведенном ниже примере, просто сделайте свой первый параметр, а затем перечислите или флаг какого-то типа. Вместо того, чтобы пропустить пустой, просто сделайте это 0
Вот ответ SO о том, как это сделать. Может ли метод С# вернуть метод?
Поэтому в вашем примере вы можете сделать это
public Func<ParamType,int> YourMethodName{
YourSwitch{
case(1)
return YourClassName.YourMethod;
break;
case(2)
return YourClassName.YourMethod2;
break
case(3)
return YourClassName.YourMethod3;
break
}
}