是否有人知道我可以调用的算法(或外部库)将任意字符串(即我的控件之外)转换为CLS兼容?
我正在为ASP.Net Report Viewer控件生成动态RDLC(客户端报表定义),并且某些字段名称需要基于用户输入的字符串。
不幸的是,我无法控制客户端输入字段名称(通过第三方CMS)。但是我对创建兼容字符串所需的替换非常灵活。
我现在有一个反应式黑客算法:
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(" ", "_");
}
但我会喜欢更全面的东西。有什么想法吗?
注意:如果有任何帮助,我用来创建动态RDLC的算法基于此处的BuildRDLC方法:http://csharpshooter.blogspot.com/2007/08/revised-dynamic-rdlc-generation.html
答案 0 :(得分:4)
这是我用来从任意字符串创建C / C ++标识符的算法(转换为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);
}
如果正则表达式结果的第一个字符不是数字,则不需要前导下划线。
答案 1 :(得分:0)
这是一个正则表达式,我发现它可用于拆分符合CLS的字符串部分和非符合CLS的字符串部分。下面用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
}
}