Comment puis-je convertir des chaînes arbitraires à des noms de CLS conforme à la norme?
-
26-09-2019 - |
Question
Quelqu'un sait-il d'un algorithme (ou bibliothèque externe) que je pourrais appeler pour convertir une chaîne arbitraire (à savoir en dehors de mon contrôle) être conforme CLS?
Je suis la génération d'une RDLC dynamique (définition de rapport client) pour un contrôle Report Viewer ASP.Net et certains des noms de champs doivent être basées sur les chaînes saisies par l'utilisateur.
Malheureusement, je peu de contrôle sur l'entrée des noms de champs par le client (par une 3ème partie CMS). Mais je suis tout à fait 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. Toutes les idées?
NOTE: Si elle est d'une aide, est basée sur la méthode BuildRDLC l'algorithme que je utilise pour créer la dynamique RDLC trouvé ici: http://csharpshooter.blogspot.com/2007/08/revised-dynamic-rdlc-generation.html
La solution
Voici l'algorithme que j'utilise pour créer C / C ++ identificateurs de chaînes arbitraires (traduit 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.
Autres conseils
Voici une expression rationnelle que j'ai trouvé pourrait être utile pour séparer 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
}
}