///
/// 系统扩展 - 命名风格
///
public static partial class Extensions
{
private const int LetterUpperLowerDistance = 'a' - 'A';
private static ExpiredCache _cache = new ExpiredCache();
///
/// 获取字符串的命名规范
/// 支持类型:UpperCamel、lowerCamel、AllUpper、AllLower、FirstUpper
///
///
/// 前缀
/// 后缀
///
public static NamingStyle GetNamingStyle(this string name, string prefix = "", string suffix = "")
{
if (_cache.ContainsKey(name))
return _cache[name];
//移除前后缀
name = name.RemovePrefix(prefix);
name = name.RemoveSuffix(suffix);
var type = GetNamingStyle(name);
_cache[name] = type;
return type;
}
private static NamingStyle GetNamingStyle(this string name)
{
//如果含有下划线字符
if (name.Contains("_"))
{
if (name.IsRegexMatch("^[A-Z_]+$", RegexOptions.Compiled | RegexOptions.Singleline))
return NamingStyle.AllUpper;
if (name.IsRegexMatch("^[a-z_]+$", RegexOptions.Compiled | RegexOptions.Singleline))
return NamingStyle.AllLower;
if (name[0].IsUpperLetter() && name.Substring(1).IsRegexMatch("^[a-z_]+$", RegexOptions.Compiled | RegexOptions.Singleline))
return NamingStyle.FirstUpper;
return NamingStyle.NonStandard;
}
if (name.IsRegexMatch("^[A-Z]+$", RegexOptions.Compiled | RegexOptions.Singleline))
return NamingStyle.AllUpper;
if (name.IsRegexMatch("^[a-z]+$", RegexOptions.Compiled | RegexOptions.Singleline))
return NamingStyle.AllLower;
if (!name.IsRegexMatch("^[A-Za-z]+$", RegexOptions.Compiled | RegexOptions.Singleline)) return NamingStyle.NonStandard;
return name[0].IsUpperLetter() ? NamingStyle.UpperCamel : NamingStyle.LowerCamel;
}
///
/// 转换字符串命名规范
/// 支持类型:UpperCamel、lowerCamel、AllUpper、AllLower、FirstUpper
///
///
///
///
///
///
public static string ConvertNamingStyle(this string name, NamingStyle toStyle, string prefix = "",
string suffix = "")
{
//移除前后缀
name = name.RemovePrefix(prefix);
name = name.RemoveSuffix(suffix);
if (name.GetNamingStyle() == NamingStyle.NonStandard)
return name;
var toName = toStyle switch
{
NamingStyle.LowerCamel => name.ToLowerCamel(),
NamingStyle.AllUpper => name.ToAllUpper(),
NamingStyle.AllLower => name.ToAllLower(),
NamingStyle.FirstUpper => name.ToFirstUpper(),
NamingStyle.UpperCamel => name.ToUpperCamel(),
_ => name
};
return $"{prefix}{toName}{suffix}";
}
//UpperCamel To Other
private static string UpperCamelToLowerCamel(this string name) => !name.IsUpperCamel() ? name : (char)(name[0] + LetterUpperLowerDistance) + name.Substring(1);
private static string UpperCamelToAllUpper(this string name) => !name.IsUpperCamel() ? name : string.Join('_', name.UpperCamelSplit().Select(letter => letter.ToUpper()));
private static string UpperCamelToAllLower(this string name) => !name.IsUpperCamel() ? name : string.Join('_', name.UpperCamelSplit().Select(letter => letter.ToLower()));
private static string UpperCamelToFirstUpper(this string name) => !name.IsUpperCamel() ? name : name[0] + name.UpperCamelToAllLower().Substring(1);
//LowerCamel To Other
private static string LowerCamelToUpperCamel(this string name) => !name.IsLowerCamel() ? name : (char)(name[0] - LetterUpperLowerDistance) + name.Substring(1);
private static string LowerCamelToAllUpper(this string name) => !name.IsLowerCamel() ? name : name.LowerCamelToUpperCamel().UpperCamelToAllUpper();
private static string LowerCamelToAllLower(this string name) => !name.IsLowerCamel() ? name : name.LowerCamelToUpperCamel().UpperCamelToAllLower();
private static string LowerCamelToFirstUpper(this string name) => !name.IsLowerCamel() ? name : (char)(name[0] - LetterUpperLowerDistance) + name.LowerCamelToUpperCamel().UpperCamelToFirstUpper().Substring(1);
//AllUpper To Other
private static string AllUpperToUpperCamel(this string name) => !name.IsAllUpper() ? name : string.Join("", name.Split('_').Select(ToFirstUpperStyle));
private static string AllUpperToLowerCamel(this string name) => !name.IsAllUpper() ? name : (char)(name[0] + LetterUpperLowerDistance) + name.AllUpperToUpperCamel().Substring(1);
private static string AllUpperToAllLower(this string name) => !name.IsAllUpper() ? name : name.ToLower();
private static string AllUpperToFirstUpper(this string name) => !name.IsAllUpper() ? name : name[0] + name.AllUpperToAllLower().Substring(1);
//AllLower To Other
private static string AllLowerToUpperCamel(this string name) => !name.IsAllLower() ? name : string.Join("", name.Split('_').Select(ToFirstUpperStyle));
private static string AllLowerToLowerCamel(this string name) => !name.IsAllLower() ? name : name[0] + name.AllLowerToUpperCamel().Substring(1);
private static string AllLowerToAllUpper(this string name) => !name.IsAllLower() ? name : name.ToUpper();
private static string AllLowerToFirstUpper(this string name) => !name.IsAllLower() ? name : (char)(name[0] - LetterUpperLowerDistance) + name.Substring(1);
//FirstUpper To Other
private static string FirstUpperToUpperCamel(this string name) => !name.IsFirstUpper() ? name : string.Join("", name.Split('_').Select(ToFirstUpperStyle));
private static string FirstUpperToLowerCamel(this string name) => !name.IsFirstUpper() ? name : (char)(name[0] + LetterUpperLowerDistance) + name.FirstUpperToUpperCamel().Substring(1);
private static string FirstUpperToAllUpper(this string name) => !name.IsFirstUpper() ? name : name.ToUpper();
private static string FirstUpperToAllLower(this string name) => !name.IsFirstUpper() ? name : name.ToLower();
//Orthers To X
private static string ToUpperCamel(this string name)
{
return name.GetNamingStyle() switch
{
NamingStyle.LowerCamel => name.LowerCamelToUpperCamel(),
NamingStyle.AllUpper => name.AllUpperToUpperCamel(),
NamingStyle.AllLower => name.AllLowerToUpperCamel(),
NamingStyle.FirstUpper => name.FirstUpperToUpperCamel(),
_ => name
};
}
private static string ToLowerCamel(this string name)
{
return name.GetNamingStyle() switch
{
NamingStyle.UpperCamel => name.UpperCamelToLowerCamel(),
NamingStyle.AllUpper => name.AllUpperToLowerCamel(),
NamingStyle.AllLower => name.AllLowerToLowerCamel(),
NamingStyle.FirstUpper => name.FirstUpperToLowerCamel(),
_ => name
};
}
private static string ToAllUpper(this string name)
{
return name.GetNamingStyle() switch
{
NamingStyle.UpperCamel => name.UpperCamelToAllUpper(),
NamingStyle.LowerCamel => name.LowerCamelToAllUpper(),
NamingStyle.AllLower => name.AllLowerToAllUpper(),
NamingStyle.FirstUpper => name.FirstUpperToAllUpper(),
_ => name
};
}
private static string ToAllLower(this string name)
{
return name.GetNamingStyle() switch
{
NamingStyle.UpperCamel => name.UpperCamelToAllLower(),
NamingStyle.LowerCamel => name.LowerCamelToAllLower(),
NamingStyle.AllUpper => name.AllUpperToAllLower(),
NamingStyle.FirstUpper => name.FirstUpperToAllLower(),
_ => name
};
}
private static string ToFirstUpper(this string name)
{
return name.GetNamingStyle() switch
{
NamingStyle.UpperCamel => name.UpperCamelToFirstUpper(),
NamingStyle.LowerCamel => name.LowerCamelToFirstUpper(),
NamingStyle.AllUpper => name.AllUpperToFirstUpper(),
NamingStyle.AllLower => name.AllLowerToFirstUpper(),
_ => name
};
}
public static bool IsUpperLetter(this char letter) => letter >= 'A' && letter <= 'Z';
public static bool IsLowerLetter(this char letter) => letter >= 'a' && letter <= 'z';
public static bool IsLetter(this char letter) => letter.IsLowerLetter() || letter.IsUpperLetter();
public static string RemovePrefix(this string str, string prefix) => str.StartsWith(prefix) ? str.Substring(prefix.Length) : str;
public static string RemoveSuffix(this string str, string suffix) => str.EndsWith(suffix) ? str.Substring(0, str.Length - suffix.Length) : str;
public static bool IsUpperCamel(this string name) => name.GetNamingStyle() == NamingStyle.UpperCamel;
public static bool IsLowerCamel(this string name) => name.GetNamingStyle() == NamingStyle.LowerCamel;
public static bool IsAllUpper(this string name) => name.GetNamingStyle() == NamingStyle.AllUpper;
public static bool IsAllLower(this string name) => name.GetNamingStyle() == NamingStyle.AllLower;
public static bool IsFirstUpper(this string name) => name.GetNamingStyle() == NamingStyle.FirstUpper;
private static IEnumerable UpperCamelSplit(this string name)
{
foreach (Match match in Regex.Matches(name, "[A-Z][a-z]+", RegexOptions.Compiled | RegexOptions.Singleline))
yield return match.Value;
}
public static string ToFirstUpperStyle(string word)
{
if (!word.IsRegexMatch("^[a-z]+$", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.IgnoreCase))
return word;
var newLetter = new char[word.Length];
for (var i = 0; i < word.Length; i++)
{
if (i == 0)
{
if (word[i].IsLowerLetter())
{
newLetter[i] = (char)(word[i] - LetterUpperLowerDistance);
}
else
{
newLetter[i] = word[i];
}
}
else
{
if (word[i].IsUpperLetter())
{
newLetter[i] = (char)(word[i] + LetterUpperLowerDistance);
}
else
{
newLetter[i] = word[i];
}
}
}
return new string(newLetter);
}
public static char ToUpper(char c) => c.IsLowerLetter() ? (char)(c - LetterUpperLowerDistance) : c;
public static char ToLower(char c) => c.IsUpperLetter() ? (char)(c + LetterUpperLowerDistance) : c;
}
public enum NamingStyle
{
NonStandard,
UpperCamel,
LowerCamel,
AllUpper,
AllLower,
FirstUpper
}