Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过解析具有相同命名常量的另一个枚举来获取枚举值_C#_.net_Enums - Fatal编程技术网

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我编辑了我的答案以支持多个“枚举”