我正在尝试使用Razor引擎生成一些动态编译的代码,我想根据源文件名命名生成的类,以帮助理解生成的代码的来源。
例如,我希望文件C:\ source \ Foo.cs使用名称Foo
进行编译。
鉴于我有编译源文件的路径,有没有办法根据文件名生成有效的C#标识符?
答案 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#类名称。 例如
这应该是全部!
答案 2 :(得分:0)
答案 3 :(得分:0)
选择路径,将“\
”等无效字符替换为_
,然后再完成。
如果您更喜欢较短的名称,可以使用路径,将其转换为小写并获取哈希值。
一些代码示例:
var className = pathIncludingFilename.ToLowerSinceCasingIsNotRelevant().SomeHashFunctionLikeSha1OrPartOfIt() + filename.RemoveInvalidCharactersLikeWhitespace();
结果可能如下所示:
123a3b6b22foo
散列应确保唯一的名称,文件名使其更容易关联。