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

时间:2014-08-05 13:12:56

标签: c# razor compilation code-generation

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

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

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

4 个答案:

答案 0 :(得分:7)

根据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删除所有无效字符。然后它会检查文件名是否以字母开头,如果是,则会预先_来修复它。

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

答案 1 :(得分:0)

首先,您需要提取文件名,例如:

Path.GetFileNameWithoutExtension

然后你必须遵循所有规则,c#类名称。 例如

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

    这应该是全部!

答案 2 :(得分:0)

答案 3 :(得分:0)

选择路径,将“\”等无效字符替换为_,然后再完成。

如果您更喜欢较短的名称,可以使用路径,将其转换为小写并获取哈希值。

一些代码示例:

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

结果可能如下所示:

123a3b6b22foo

散列应确保唯一的名称,文件名使其更容易关联。