我正在尝试使用 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/