C# 如何通过解析具有相同命名常量的另一个枚举来获取枚举值
考虑以下两种枚举C# 如何通过解析具有相同命名常量的另一个枚举来获取枚举值,c#,.net,enums,C#,.net,Enums,考虑以下两种枚举 public enum EFileTag { Clean, Modified } public enum EHgFileTag { Modified = 'M', Clean = 'C' } 对于EFileTag的值,我需要得到EHgFileTag的等效值 示例:'C'用于EFileTag.Clean 我用计算机解决了这个问题 EFileTag ft = EFileTag.Clean; string ftstr = Enum.GetName
public enum EFileTag {
Clean,
Modified
}
public enum EHgFileTag {
Modified = 'M',
Clean = 'C'
}
对于EFileTag的值,我需要得到EHgFileTag的等效值
示例:'C'用于EFileTag.Clean
我用计算机解决了这个问题
EFileTag ft = EFileTag.Clean;
string ftstr = Enum.GetName (typeof (EFileTag), ft);
if (Enum.TryParse (ftstr, out EHgFileTag tag)) {
char hgft = (char)tag;
}
有没有更好/更有效的方法来完成转换?您可以有一本字典,如:
public static readonly Dictionary<EFileTag, EHgFileTag> dict = new Dictionary<EFileTag, EHgFileTag>
{
{ EFileTag.Clean, EHgFileTag.Clean },
{ EFileTag.Modified, EHgFileTag.Modified }
}
编辑:
我一直认为以这种方式使用枚举没有多大意义。正如您现在要求在混合中添加另一个枚举一样,我决定改变枚举的概念
public enum EFileTag
{
Clean,
Modified
}
public class FileTag
{
public EFileTag EFileTag { get; private set; }
public char EHgFileTag { get; private set; }
public char EGitFileTag { get; private set; }
public FileTag(EFileTag eFileTag, char eHgFileTag, char eGitFileTag)
{
EFileTag = eFileTag;
EHgFileTag = eHgFileTag;
EGitFileTag = eGitFileTag;
}
}
public class SomeClass
{
public static readonly Dictionary<EFileTag, FileTag> tags = new Dictionary<EFileTag, FileTag>
{
{EFileTag.Clean, new FileTag(EFileTag.Clean, 'C', ' ') },
{EFileTag.Modified, new FileTag(EFileTag.Modified, 'M', 'M') },
};
var tag = tags[EFileTag.Clean];
//tag would be of class FileTag
var hgft = tag.EHgFileTag;
//hgft would be 'C'
var gft= tag.EGitFileTag;
//gft would be ' '
}
public enum EFileTag
{
清洁的
被改进的
}
公共类文件标签
{
public EFileTag EFileTag{get;private set;}
公共字符EHgFileTag{get;private set;}
公共字符EGitFileTag{get;private set;}
公共文件标签(EFileTag EFileTag、char eHgFileTag、char eGitFileTag)
{
EFileTag=EFileTag;
EHgFileTag=EHgFileTag;
EGitFileTag=EGitFileTag;
}
}
公共类
{
公共静态只读字典标记=新字典
{
{EFileTag.Clean,新文件标签(EFileTag.Clean,'C',''),
{EFileTag.Modified,新文件标签(EFileTag.Modified,'M','M'),
};
var tag=tags[EFileTag.Clean];
//标记将属于FileTag类
var hgft=tag.EHgFileTag;
//hgft将是“C”
var gft=tag.EGitFileTag;
//gft将是“
}
现在,您只有一个描述基本文件标记的枚举,并且附加了您想要访问的字符。这比使用多个枚举更干净、更易于理解和处理。对于未来,我建议您不要像以前那样使用enum,因为它实际上不是应该使用的方式。枚举是一种命名枚举的方法,仅用于理解目的,而不是携带实际值的方法。
另外,如果您想添加另一个字符或其他内容,您现在可以轻松地进行添加。如果您知道
EHgFileTag
的名称与EFileTag
兼容,这就是标题所建议的
var ft = EFileTag.Clean;
var hgft = (char)(EHgFileTag)Enum.Parse(typeof(EHgFileTag), ft.ToString());
对于使用另一个枚举的命名常量获取枚举值,您的解决方案是显而易见的。但您仍然可以通过以下内容来增强它 获取转换值:
try {
var d = Enum.Parse (GetRepoType (), nameof (EFileTag.Clean));
Console.WriteLine ($"USAGE: {d} - {Convert.ToChar (d)} - {(int)d}");
} catch (Exception e) {
Console.WriteLine (e);
}
static Type GetRepoType () {
// [typeName - set the typeName with args (or) config settings]
switch (typeName) {
case "hg": return typeof (EHgFileTag);
case "git": return typeof (EGitFileTag);
// Extend cases for other repositories.........
default: return typeof (EHgFileTag);
}
}
获取适当转换类型的方法:
try {
var d = Enum.Parse (GetRepoType (), nameof (EFileTag.Clean));
Console.WriteLine ($"USAGE: {d} - {Convert.ToChar (d)} - {(int)d}");
} catch (Exception e) {
Console.WriteLine (e);
}
static Type GetRepoType () {
// [typeName - set the typeName with args (or) config settings]
switch (typeName) {
case "hg": return typeof (EHgFileTag);
case "git": return typeof (EGitFileTag);
// Extend cases for other repositories.........
default: return typeof (EHgFileTag);
}
}
考虑一个具有相同命名常量的第三枚举的场景:代码>公共枚举EGITFILTEAG {修改= 'm’,Cale= ''} /Cord.>如果给定的EfLeTeAG值,我们现在将是一个高效的转换解决方案,并且我们只能动态地知道RePO(.Git,.Hg,……)的类型。你能给我一个通用的解决方案吗?谢谢您的帮助:“@ dfHWZE您还可以考虑上述情况并提供一个answer@pradeep我编辑了我的答案以支持多个“枚举”