преобразуйте перечисление в другой тип перечисления

Таким образом, было много комментариев о том, что метод расширения ForEach не является соответствующим, потому что он не возвращает значение как дополнительные методы LINQ. В то время как это - фактический оператор, это не совершенно верно.

дополнительные методы LINQ действительно все возвращают значение, таким образом, они могут быть объединены в цепочку вместе:

collection.Where(i => i.Name = "hello").Select(i => i.FullName);

Однако просто, потому что LINQ реализован с помощью дополнительных методов, не означает, что дополнительные методы должны использоваться таким же образом и возвратить значение. Запись дополнительного метода для представления общей функциональности, которая не возвращает значение, является совершенно допустимым использованием.

определенный arguement о ForEach - то, что, на основе ограничений на дополнительные методы (а именно, что дополнительный метод будет никогда , переопределяют унаследованный метод с та же подпись ), может быть ситуация, где пользовательский дополнительный метод доступен на всех классах что impelement IEnumerable<T> кроме Списка <T>. Это может вызвать беспорядок, когда методы начинают вести себя по-другому в зависимости от того, называют ли дополнительный метод или наследовать метод.

108
задан shA.t 15 February 2016 в 10:09
поделиться

6 ответов

Using an extension method works quite neatly, when using the two conversion methods suggested by Nate:

public static class TheirGenderExtensions
{
    public static MyGender ToMyGender(this TheirGender value)
    {
        // insert switch statement here
    }
}

public static class MyGenderExtensions
{
    public static TheirGender ToTheirGender(this MyGender value)
    {
        // insert switch statement here
    }
}

Obviously there's no need to use separate classes if you don't want to. My preference is to keep extension methods grouped by the classes/structures/enumerations they apply to.

79
ответ дан 24 November 2019 в 03:25
поделиться

Учитывая значение Enum1 = ... , тогда, если вы имеете в виду по имени:

Enum2 value2 = (Enum2) Enum.Parse(typeof(Enum2), value.ToString());

Если вы имеете в виду числовое значение, обычно вы можете просто привести:

Enum2 value2 = (Enum2)value;

(однако с приведением типов вы можете использовать Enum.IsDefined для проверки допустимых значений)

203
ответ дан 24 November 2019 в 03:25
поделиться

Just cast one to int and then cast it to the other enum (considering that you want the mapping done based on value):

Gender2 gender2 = (Gender2)((int)gender1);
45
ответ дан 24 November 2019 в 03:25
поделиться

To be thorough I normally create a pair of functions, one that takes Enum 1 and returns Enum 2 and another that takes Enum 2 and returns Enum 1. Each consists of a case statement mapping inputs to outputs and the default case throws an exception with a message complaining about an unexpected value.

In this particular case you could take advantage of the fact that the integer values of Male and Female are the same, but I'd avoid that as it's hackish and subject to breakage if either enum changes in the future.

20
ответ дан 24 November 2019 в 03:25
поделиться

вы можете написать простую функцию вроде следующей:

public static MyGender ConvertTo(TheirGender theirGender)
{
    switch(theirGender)
    {
        case TheirGender.Male:
            break;//return male
        case TheirGender.Female:
            break;//return female
        case TheirGender.Unknown:
            break;//return whatever
    }
}
8
ответ дан 24 November 2019 в 03:25
поделиться

Вы можете использовать ToString () для преобразования первого перечисления в его имя, а затем Enum.Parse () для преобразования строки обратно в другое Enum. Это вызовет исключение, если значение не поддерживается перечислением назначения (например, для значения «Неизвестно»)

0
ответ дан 24 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: