COMO SIMPLIFICAR SWITCH CASE?

 Tópico anterior Próximo tópico Novo tópico

COMO SIMPLIFICAR SWITCH CASE?

C#

 Compartilhe  Compartilhe  Compartilhe
#495597 - 09/11/2020 10:50:57

ACDONA
INDAIATUBA
Cadast. em:Janeiro/2009


Olá, tem como diminuir o código abaixo eliminando o switch case?

switch (e.KeyChar.ToString())
            {
                case '0':
                    btn0.PerformClick();
                    e.Handled = true;
                    break;

                case '1':
                    btn1.PerformClick();
                    e.Handled = true;
                    break;
                case '2':
                    btn2.PerformClick();
                    e.Handled = true;
                    break;  .. e por aí vai....

Alguma coisa assim:-
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            string teste = 'btn' + e.KeyChar.ToString() + '.PerformClick()';
executar ==> teste
Procurei por macro substituição , mas não encontrei uma solução em  C#



#495598 - 09/11/2020 12:48:08

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Você vai conseguir isso com Reflection. Mais ou menos assim:

Button btn = this.Controls.OfType<Button>().ToList().FirstOrDefault(b => b.Name == 'btn' + e.KeyChar.ToString());
btn.PerformClick();
e.Handled = true;
break.




_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#495600 - 09/11/2020 15:55:46

ACDONA
INDAIATUBA
Cadast. em:Janeiro/2009


Citação:
:
Você vai conseguir isso com Reflection. Mais ou menos assim:

Button btn = this.Controls.OfType<Button>().ToList().FirstOrDefault(b => b.Name == 'btn' + e.KeyChar.ToString());
btn.PerformClick();
e.Handled = true;
break.




Deu certo , não ficou muito 'bonito' o código, mais ficou menor:
  private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            try
            {
                if (Convert.ToDouble(e.KeyChar.ToString()) >= 0 && Convert.ToDouble(e.KeyChar.ToString()) <= 9)
                {
                    Button btn = this.Controls.OfType<Button>().ToList().FirstOrDefault(b => b.Name == 'btn' + e.KeyChar.ToString());
                    btn.PerformClick();
                    e.Handled = true;
                }
            }
            catch (Exception)
            {
                try
                {
                    string NomeBotao = e.KeyChar.ToString();
                    if (NomeBotao == '+') { NomeBotao = 'Somar'; }
                    if (NomeBotao == '-') { NomeBotao = 'Subtrair'; }
                    if (NomeBotao == '*') { NomeBotao = 'Multiplicar'; }
                    if (NomeBotao == '/') { NomeBotao = 'Dividir'; }
                    if (NomeBotao == '.' || NomeBotao == ',') { NomeBotao = 'Ponto'; }
                    int Tecla = e.KeyChar.GetHashCode();
                    if (Tecla == 851981) { NomeBotao = 'Igual'; }
                    if (Tecla == 524296) { NomeBotao = 'BS'; }
                    if (Tecla == 1769499) { NomeBotao = 'CE'; }
                    Button btn = this.Controls.OfType<Button>().ToList().FirstOrDefault(b => b.Name == 'btn' + NomeBotao);
                    btn.PerformClick();
                    e.Handled = true;
                }
                catch { }
            }
        }




#495602 - 09/11/2020 18:36:16

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe

Última edição em 09/11/2020 18:37:12 por KERPLUNK

Não é o ideal, mas já ficaria melhor:


try
            {
                string NomeBotao = e.KeyChar.ToString();
                if (!BotaoUtils.IsNumeric(NomeBotao)
                {
                     NomeBotao = BotaoUtils.GetFuncao(NomeBotao);
                }

                Button btn = this.Controls.OfType<Button>().ToList().FirstOrDefault(b => b.Name == 'btn' + NomeBotao);
                btn.PerformClick();
                e.Handled = true;
            }
            catch (Exception)
            {
                throw;
            }



Em outra classe:

public static class BotaoUtils{
    public static bool IsNumeric(string value)
    {
        return value.All(char.IsNumber);
    }
    public static string GetFuncao(string funcao)
    {
                     string NomeBotao = funcao.ToString();
                    if (NomeBotao == '+') { NomeBotao = 'Somar'; }
                    if (NomeBotao == '-') { NomeBotao = 'Subtrair'; }
                    if (NomeBotao == '*') { NomeBotao = 'Multiplicar'; }
                    if (NomeBotao == '/') { NomeBotao = 'Dividir'; }
                    if (NomeBotao == '.' || NomeBotao == ',') { NomeBotao = 'Ponto'; }
                    int Tecla = e.KeyChar.GetHashCode();
                    if (Tecla == 851981) { NomeBotao = 'Igual'; }
                    if (Tecla == 524296) { NomeBotao = 'BS'; }
                    if (Tecla == 1769499) { NomeBotao = 'CE'; }
    }
}



_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#495610 - 10/11/2020 11:27:11

ACDONA
INDAIATUBA
Cadast. em:Janeiro/2009


Última edição em 10/11/2020 11:29:02 por ACDONA

Obrigado pela ajuda,
Mas deu erro aqui :- public static string GetFuncao(string funcao)
GetFuncao -> 'nem todos os caminhos de código retornam um valor'
Então deixei a classe assim:
   public static class BotaoUtils
    {
        public static bool IsNumeric(string value)
        {
            return value.All(char.IsNumber);
        }
    }


e no form :
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            string NomeBotao = e.KeyChar.ToString();
            try
            {
                if (!BotaoUtils.IsNumeric(NomeBotao))
                {
                    if (NomeBotao == '+') { NomeBotao = 'Somar'; }
                    if (NomeBotao == '-') { NomeBotao = 'Subtrair'; }
                    if (NomeBotao == '*') { NomeBotao = 'Multiplicar'; }
                    if (NomeBotao == '/') { NomeBotao = 'Dividir'; }
                    if (NomeBotao == '.' || NomeBotao == ',') { NomeBotao = 'Ponto'; }
                    if (NomeBotao == 'c' || NomeBotao == 'C') { NomeBotao = 'Limpar'; }
                    int Tecla = e.KeyChar.GetHashCode();
                    if (Tecla == 851981) { NomeBotao = 'Igual'; }
                    if (Tecla == 524296) { NomeBotao = 'BS'; }
                    if (Tecla == 1769499) { NomeBotao = 'CE'; }
                }
                Button btn = this.Controls.OfType<Button>().ToList().FirstOrDefault(b => b.Name == 'btn' + NomeBotao);
                if (btn == null) { return; }
                btn.PerformClick();
                e.Handled = true;
            }
            catch (Exception)
            {
                throw;
            }
        }  




Resposta escolhida #495612 - 10/11/2020 12:59:32

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Esqueci o return no GetFuncao... entenda que as coisas que postamos aqui, geralmente são exemplos e não um 'copia-cola-roda'. Tem coisas que vai ter que adaptar e testar. A intenção é deixar o mínimo de código possível no form.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#495632 - 12/11/2020 10:57:26

ACDONA
INDAIATUBA
Cadast. em:Janeiro/2009


Obrigado Kerperlunk, a dúvida foi resolvida com êxito!

  Button btn = this.Controls.OfType<Button>().ToList().FirstOrDefault(b => b.Name == 'btn' + NomeBotao);






 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por ACDONA em 12/11/2020 10:57:58