Pregunta

¿Alguien sabe de un algoritmo (o biblioteca externa) que podría llamar para convertir una cadena arbitraria (es decir, fuera de mi control) para ser compatible con CLS?

estoy generando una dinámica RDLC (Informe de cliente Definición) para un control ASP.Net Visor de informes y algunos de los nombres de campo deben estar basados ??en cadenas introducidas por el usuario.

Por desgracia, tiene poco control sobre la entrada de los nombres de campo por el cliente (a través de una tercera parte de la CMS). Pero estoy sustituciones de todo bastante flexibles necesarios para crear la cadena compatible.

Tengo un algoritmo de corte reactiva por ahora a lo largo de las líneas 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(" ", "_");
}

Pero me gustaría algo más amplio. Algunas ideas?

NOTA: Si se trata de cualquier ayuda, el algoritmo que estoy utilizando para crear el RDLC dinámica se basa en el método BuildRDLC encontrar aquí: http://csharpshooter.blogspot.com/2007/08/revised-dynamic-rdlc-generation.html

¿Fue útil?

Solución

Este es el algoritmo que utilizo para crear identificadores de C / C ++ de cadenas arbitrarias (traducido a 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);
    }

El subrayado inicial es innecesaria si el primer carácter del resultado de expresiones regulares no es numérico.

Otros consejos

Esta es una expresión regular que me pareció que podría ser útil para dividir compatible con CLS parte de cadena y no compatible con CLS parte de cadenas. A continuación la aplicación en 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top