如何从文件名生成安全的类名?

本文关键字:安全 文件名 | 更新日期: 2023-09-27 18:16:23

我正在尝试用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);
}

它首先将文件名转换为驼角大小写(个人偏好),然后使用isvalididdentifier来确定文件名是否已经对类名有效。

如果不是,它将根据unicode字符类删除所有无效字符。然后检查文件名是否以字母开头,如果是以字母开头,则添加一个_来修复它。

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

首先,您需要提取File-Name,例如:

Path.GetFileNameWithoutExtension

那么你必须遵循c#类名的所有规则。例如

  1. 以字母或_开头
  2. 我将删除除_ AND a-z AND 0-9以外的所有其他字符

这应该是所有!

你看了代码dom - http://msdn.microsoft.com/en-us/library/ms404245(v=vs.110).aspx吗?

取路径,将无效字符如'替换为_,然后完成。

如果您喜欢更短的名称,您可以获取路径,将其转换为小写并接受散列值。

代码示例:

var className = pathIncludingFilename.ToLowerSinceCasingIsNotRelevant().SomeHashFunctionLikeSha1OrPartOfIt() + filename.RemoveInvalidCharactersLikeWhitespace();

结果可能如下所示:

123 a3b6b22foo

哈希应该确保唯一的名称,文件名使其更容易关联。