【问题标题】:How can I convert arbitrary strings to CLS-Compliant names?如何将任意字符串转换为符合 CLS 的名称?
【发布时间】:2016-11-29 20:24:47
【问题描述】:

有谁知道我可以调用一个算法(或外部库)来将任意字符串(即不受我控制的字符串)转换为符合 CLS 标准?

我正在为 ASP.Net 报告查看器控件生成动态 RDLC(客户端报告定义),并且某些字段名称需要基于用户输入的字符串。

不幸的是,我几乎无法控制客户端输入的字段名称(通过第 3 方 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

【问题讨论】:

    标签: asp.net rdlc cls-compliant


    【解决方案1】:

    这是我用来从任意字符串(转换为 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);
        }
    

    如果正则表达式结果的第一个字符不是数字,则不需要前导下划线。

    【讨论】:

    • 不错的一个!正则表达式不能做什么:)
    • 我认为符合 CLS 的名称不允许使用前导下划线。见stackoverflow.com/a/1195061/1086134。另请注意,如果您将上述算法应用于字符串集合,您最终可能会得到一组不唯一的名称。
    • @Martin_ATS 你是对的。如何获得一组唯一的名称?将运行时生成的 GUID 字符串附加到名称后,使用 'Guid.NewGuid().ToString()' 解决了这个问题,但在某些情况下它会使名称过长而不实用。
    • 全行代码:string unique = safe + Guid.NewGuid().ToString("N");
    【解决方案2】:

    这是一个正则表达式,我发现它可用于拆分符合 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
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-18
      • 1970-01-01
      • 2015-04-02
      • 2017-09-08
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 2021-12-01
      • 2015-07-26
      相关资源
      最近更新 更多