C# reflete na enumeração por meio da string do tipo de enumeração

Refletir qualquer tipo por tipo string

Old Gu escreveu um blog antes. Através da reflexão e do uso de strings, todos os tipos disponíveis no projeto atual podem ser refletidos, incluindo tipos genéricos. Amigos que precisam inventar aulas podem assistir ao artigo anterior de Lao Gu " C# Criar objetos de qualquer tipo (incluindo genéricos) com base na string Typename ".

Embora o próprio Lao Gu tenha dito que usar esse método geralmente é sua escolha para cair no buraco, ele é realmente usado às vezes.

tipo enumerado

Geralmente, nos programas por nós desenvolvidos, para dados específicos limitados, geralmente fazemos um tipo de enumeração para padronizar todos os pequenos parceiros participantes do projeto e evitar ambiguidade ou conteúdo irregular.

Por exemplo, o status de um pedido pode ser dividido em vários estágios de acordo com o processo de negócio:

Enviar
Pedido Pendente Recebido
Pagamento
Pendente
Pago Envio
Pendente
Envio Envio Concluído
Pedido Concluído

E assim por diante, em um conjunto finito de estados.
insira a descrição da imagem aqui
Por exemplo, ao acessar recursos de rede, alguns códigos de status serão retornados, como 200, 404, 401, 500, etc. Esses são estados finitos, então normalmente podemos usar Enum para definir um conjunto de enumeração para padronizar os dados.

Este tipo de operação visa principalmente evitar que alguns pequenos parceiros escrevam com pagamento pendente, alguns pequenos parceiros escrevam sem pagar e alguns escrevam com pagamento pendente. . . Resumindo, Deus sabe quantos dados com o mesmo significado aparecerão sem a especificação da enumeração.

Blog do analfabeto CSDN Lao Gu , https://blog.csdn.net/superwfei
Comunidade pessoal de Lao Gu , https://bbs.csdn.net/forums/bfba6c5031e64c13aa7c60eebe858a5f?category=10003&typeId=3364713

Invocando um enum por meio de reflexão

Na maioria das vezes, quando usamos uma enumeração, sabemos claramente seu tipo, então geralmente usamos diretamente Enum.GetName(enumeration type, value) para obter a descrição de texto correspondente.

No entanto, ocasionalmente, a posição onde precisamos chamar a enumeração não é o nosso código manuscrito, mas algo como uma definição de modelo. Por exemplo, agora Lao Gu tem uma definição de modelo:

404.enum.httpstate

404 é o valor, enum é a enumeração de chamada e httpsstate é o tipo de enumeração

Se estiver escrito normalmente no programa, então deveria ser assim

Enum.GetName(httpstate,404)

Mas as palavras no modelo. . . Este httpsstate pode ser analisado, mas e se houver vários modelos e os tipos de enumeração forem inconsistentes?

Por exemplo, existe um conteúdo de modelo:

html symbols: ^lt,enum,htmlsymbols^ ^trage,enum,htmlsymbols^ ^gt,enum,htmlsymbols^
http state: ^200.enum.httpstate^ ^403.enum.httpstate^ ^500.enum.httpstate^ 
bidstate: ^11.enum.trade^ ^91.enum.trade^ ^99.enum.trade^

Então, existem três tipos enumerados aqui. Se houver poucos, é possível usar o programa para ramificar um por um, ou alternar, se houver poucos, mas se houver novos tipos, ainda é muito doloroso e muitas vezes requer Mudou o código.

Portanto, ainda implementamos chamadas de enumeração por meio de reflexão.

GetTypeByName(EnumName) está vazio?

Usamos diretamente o método GetTypeByName definido anteriormente para chamar a classe por meio da string do nome da classe, e os parâmetros nele são fornecidos a um tipo de enumeração. . . resultado. . . Não é possível obter o tipo de enumeração? Tipo retorna nulo? ?

Eu até descobri os genéricos, você me diz, enumerações não podem ser usadas?

                        foreach (Type st in ts)
                        {
    
    
                            if (RegexExpand.IsMatch(st.FullName, @"\." + RegexExpand.FormatRegExp(source) + @"(`?\d+)?$"))
                            {
    
    
                                return st;
                            }
                        }

Abra o código original, na linha RegexExpand.IsMatch, Lao Gu atingiu um ponto de interrupção e encontrou o tipo de string da enumeração Enum. . . Um pouco estupefato.

insira a descrição da imagem aqui
Bem, para classes, FullName é o caminho de xxx.yyy.zzz, genérico é o caminho de xxx.yyy.zzz`n, como resultado, tipo de enumeração, você deu um caminho de xxx.yyy+zzz. . . .

Portanto, é muito simples de modificar, basta substituir o @“\.” normal no código agora por @"[\.+]" .

Então, podemos chamar a enumeração para processar o conteúdo normalmente:

                        try
                        {
    
    
                            Type t = Common.GetTypeByName(枚举类型字符串);
                            return Enum.GetName(t, int.Parse(枚举值));
                        }
                        catch (Exception ex)
                        {
    
    
                            return ex.Message;
                        }

resumo

Bem, não há muito para resumir, apenas o formato do FullName, que é um pouco inesperado, talvez existam outras formas de FullName. Resumindo, é melhor saber mais.

Além disso, deixe-me acrescentar que você pode modificar diretamente RegexExpand para Regex. Esta é uma classe estática definida por Lao Gu, que herda e expande Regex.

O método FormatRegExp serve para converter uma string em uma expressão regular, semelhante a re.escape em py

        public static string FormatRegExp(string str)
        {
    
    
            return str.Replace("\\", @"\\").Replace("(", "\\(").Replace(")", "\\)").Replace("{", "\\{").Replace("}", "\\}").Replace("[", "\\[").Replace("]", "\\]").Replace(".", "\\.").Replace("+", "\\+").Replace("-", "\\-").Replace("^", "\\^").Replace("$", "\\$").Replace("?", "\\?").Replace("*", "\\*").Replace("|", "\\|");
        }

Na verdade, basta substituir alguns caracteres e você pode colocá-los onde quiser.

insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/superwfei/article/details/131834273
Recomendado
Clasificación