2010-06-09 4 views
1

Quelqu'un connaît-il un algorithme (ou une bibliothèque externe) que je pourrais appeler pour convertir une chaîne arbitraire (c'est-à-dire en dehors de mon contrôle) pour être compatible CLS?Comment convertir des chaînes arbitraires en noms compatibles CLS?

Je génère un RDLC dynamique (Définition de rapport client) pour un contrôle ASP.Net Report Viewer et certains noms de champs doivent être basés sur des chaînes entrées par l'utilisateur.

Malheureusement, j'ai peu de contrôle sur la saisie des noms de champs par le client (via un CMS tiers). Mais je suis assez flexible autour des substitutions nécessaires pour créer la chaîne conforme.

J'ai un algorithme de hack réactif pour l'instant le long des lignes 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(" ", "_"); 
} 

Mais j'aimerais quelque chose de plus complet. Des idées?

NOTE: Si elle est d'une aide, l'algorithme que je utilise pour créer la RDLC dynamique est basée sur la méthode BuildRDLC trouvée ici: http://csharpshooter.blogspot.com/2007/08/revised-dynamic-rdlc-generation.html

Répondre

4

est ici l'algorithme que j'utilise pour créer des identifiants C/C++ de arbitraires (chaînes traduites en 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); 
    } 

le underscore est inutile si le premier caractère du résultat regex est pas numérique.

+0

Nice one! Ce que ne peuvent pas faire les expressions régulières :) –

+1

Je pense que le trait de soulignement principal n'est pas autorisé pour un nom compatible CLS. Voir http://stackoverflow.com/a/1195061/1086134. Gardez également à l'esprit que si vous appliquez l'algorithme ci-dessus à une collection de chaînes, vous risquez de vous retrouver avec un ensemble de noms non unique. –

+0

@Martin_ATS Vous avez raison. Comment obtenir un ensemble unique de noms? L'ajout au nom d'une chaîne GUID générée à l'exécution avec 'Guid.NewGuid(). ToString()' le résout, mais il rend le nom trop long pour être pratique dans certains cas. –

0

Voici une expression rationnelle que j'ai trouvée utile pour scinder une partie de chaîne conforme à CLS et une partie de chaîne non conforme à CLS. Ci-dessous la mise en œuvre 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 
    } 
} 
Questions connexes