如何通过解析具有相同命名常量的另一个枚举来获取枚举值

时间:2019-07-10 06:45:03

标签: c# .net enums

请考虑以下两个枚举;

public enum EFileTag {
    Clean,
    Modified
}

public enum EHgFileTag {
    Modified = 'M',
    Clean = 'C'
}

使用EFileTag的值,我需要获取EHgFileTag的等效值 示例: EFileTag.Clean

'C'

我通过使用解决了这个问题;

EFileTag ft = EFileTag.Clean;
string ftstr = Enum.GetName (typeof (EFileTag), ft);
if (Enum.TryParse (ftstr, out EHgFileTag tag)) {
    char hgft = (char)tag;
}

是否有更好/有效的方法来完成转换?

3 个答案:

答案 0 :(得分:2)

您可能有一个像这样的字典

public static readonly Dictionary<EFileTag, EHgFileTag> dict = new Dictionary<EFileTag, EHgFileTag> 
{
    { EFileTag.Clean, EHgFileTag.Clean },
    { EFileTag.Modified, EHgFileTag.Modified }
}

现在您可以通过传递另一个有效地获得一个枚举。

var tag = dict[EFileTag.Clean];
//tag would be EHgFileTag.Clean
//you can get the char now like you did in your example
var hgft = (char)tag;
//hgft would be 'C'

编辑:

我一直认为以这种方式使用枚举没有多大意义。当您现在要求在组合中添加另一个枚举时,我决定将概念从枚举更改为其他形式。

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 ' '
}

现在,您只有一个枚举来描述您的基本文件标记,并且附加了要访问的字符。这比具有多个枚举要干净得多,并且更好地理解和处理。对于将来,我建议您不要像以前那样使用枚举,因为这实际上不是应该使用它们的方式。枚举只是为了理解目的而命名枚举的一种方式,而不是携带实际值的方式。 另外,如果您想添加其他字符或其他内容,现在也可以轻松做到。

答案 1 :(得分:0)

如果您知道EHgFileTag的名称与EFileTag兼容(这就是标题所暗示的),这是一个解决方案。

var ft = EFileTag.Clean;
var hgft = (char)(EHgFileTag)Enum.Parse(typeof(EHgFileTag), ft.ToString());

答案 2 :(得分:0)

您的解决方案很明显,即使用另一个Enum的命名常量获取Enum值。但是您仍然可以通过以下方法对其进行增强。

获取转换价值:

|seq|key|value|
|=--+---+----=|
|I1 |A  |1    |
|I1 |B  |2    |
|I1 |C  |3    |
|I2 |A  |2    |
|I2 |C  |4    |
|I3 |A  |2    |
|I3 |B  |4    |
'---+---+-----'

获取适当类型进行转换的方法:

try {
  var d = Enum.Parse (GetRepoType (), nameof (EFileTag.Clean));
  Console.WriteLine ($"USAGE: {d} - {Convert.ToChar (d)} - {(int)d}");
} catch (Exception e) {
  Console.WriteLine (e);
}