c# - 如何从文件名生成安全类名?

标签 c# razor compilation code-generation

我正在尝试使用 Razor 引擎生成一些动态编译的代码,并且我想根据它们的源文件名来命名生成的类,以帮助理解一段生成的代码来自何处。

例如,我希望文件 C:\source\Foo.cs 以名称 Foo 编译。

鉴于我有正在编译的源文件的路径,有没有办法根据文件名生成有效的 C# 标识符?

最佳答案

根据 C# 规范,创建标识符时必须遵守以下规则:

  • 标识符必须以字母或下划线开头
  • 在第一个字符之后,可以包含数字、字母、连接符等
  • 如果标识符是关键字,则必须在前面加上“@”

这个助手将满足这些条件:

private static string GenerateClassName(string value)
{
    string className = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(value);
    bool isValid = Microsoft.CSharp.CSharpCodeProvider.CreateProvider("C#").IsValidIdentifier(className);

    if (!isValid)
    { 
        // File name contains invalid chars, remove them
        Regex regex = new Regex(@"[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Nl}\p{Mn}\p{Mc}\p{Cf}\p{Pc}\p{Lm}]");
        className = regex.Replace(className, "");

        // Class name doesn't begin with a letter, insert an underscore
        if (!char.IsLetter(className, 0))
        {
            className = className.Insert(0, "_");
        }
    }

    return className.Replace(" ", string.Empty);
}

它首先将文件名转换为驼峰式(个人偏好),然后使用IsValidIdentifier确定文件名是否已经对类名有效。

如果不是,它将根据 unicode character classes 删除所有无效字符.然后它检查文件名是否以字母开头,如果是,它会在前面加上一个 _ 来修复它。

最后,我删除了所有空格(即使它仍然是一个有效的标识符)。

关于c# - 如何从文件名生成安全类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25139734/

相关文章:

c++ - 每次编译cuda源码时md5sum的值都会变化

C++ -Weffc++ 警告与指针

c# - 带前缀的 AutoMapper

c# - ReSharper 间歇性地显示有效 Razor 代码的红色错误

c# - 清除由 TagBuilder AddCssClass MVC4 添加的 CSS

编译时在代码中替换Java静态最终值?

c# - 摆脱 wcf 数据服务紧耦合

c# - 如何在 Unity 中运行外部应用程序并将其渲染为游戏中的游戏对象?

c# - DataSource 改变前的 DataGridView 事件

asp.net-mvc - 如何在razor中将 Angular 标签添加到html属性