Pergunta

Alguém conhece um algoritmo (ou biblioteca externa) que eu poderia ligar para converter uma string arbitrária (ou seja, fora do meu controle) para ser compatível com CLS?

Estou gerando um RDLC dinâmico (definição do relatório do cliente) para um controle do Visualizador de relatórios do ASP.NET e alguns dos nomes de campo precisam ser baseados em strings inseridos pelo usuário.

Infelizmente, tenho pouco controle sobre a entrada dos nomes de campo pelo cliente (por meio de um CMS de terceiros). Mas sou bastante flexível em torno de substituições necessárias para criar a string compatível.

Eu tenho um algoritmo de hack reativo por enquanto, ao longo das linhas de:

public static string FormatForDynamicRdlc(this string s)
{
    //We need to change this string to be CLS compliant.
    return s.Replace(Environment.NewLine, string.Empty)
        .Replace("\t", string.Empty)
        .Replace(",", string.Empty)
        .Replace("-", "_")
        .Replace(" ", "_");
}

Mas eu adoraria algo mais abrangente. Alguma ideia?

Nota: Se tiver ajuda, o algoritmo que estou usando para criar o RDLC dinâmico é baseado no método Buildrdlc encontrado aqui: http://csharpsshooter.blogspot.com/2007/08/revised-dynamic-rdlc-generação.html

Foi útil?

Solução

Aqui está o algoritmo que eu uso para criar identificadores C/C ++ a partir de strings arbitrários (traduzidos para C#):

    static void Main(string[] args)
    {
        string input = "9\ttotally no @ # way!!!!";
        string safe = string.Concat("_", Regex.Replace(input, "[^a-z0-9_]+", "_"));
        Console.WriteLine(safe);
    }

O sublinhado principal é desnecessário se o primeiro caractere do resultado do regex não for numérico.

Outras dicas

Aqui está um regex que eu achei que pode ser útil para dividir a parte da string compatível com CLS e a peça de string não-Cls compatível com CLS. Abaixo da implementação em C#:

string strRegex = @"^(?<nonCLSCompliantPart>[^A-Za-z]*)(?<CLSCompliantPart>.*)";
Regex myRegex = new Regex(strRegex, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
string strTargetString = @"                            _aaaaaa[5]RoundingHeader";

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Add your code here
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top