Как получить значение перечисления путем анализа другого перечисления с такими же именованными константами - PullRequest
2 голосов
/ 10 июля 2019

Рассмотрим следующие два перечисления;

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

Есть ли лучший / эффективный способ выполнить преобразование?

Ответы [ 3 ]

3 голосов
/ 10 июля 2019

Вы можете иметь словарь как:

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'

Edit:

Я всегда думал, что использование перечислений таким образом не имеет особого смысла. Теперь, когда вы попросили добавить еще одно перечисление в микс, я решил изменить концепцию от перечислений.

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 голос
/ 15 июля 2019

Ваше решение очевидно для получения значения Enum с другими именованными константами Enum. Но вы все еще можете улучшить его следующим:

Получение преобразованного значения:

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);
  }
}
0 голосов
/ 10 июля 2019

Вот решение, если вы знаете, что имена EHgFileTag совместимы с EFileTag, что и предполагает название.

var ft = EFileTag.Clean;
var hgft = (char)(EHgFileTag)Enum.Parse(typeof(EHgFileTag), ft.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...