Как ограничить Generi c для Enum и Integral numberri c типов - PullRequest
1 голос
/ 02 марта 2020

Из приведенного ниже URL: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters#enum -ограничений

Он читает

Перечисление ограничений Начиная с C# 7.3, вы также можете указать Тип System.Enum как ограничение базового класса. CLR всегда допускал это ограничение, но язык C# запрещал его. Обобщения, использующие System.Enum, обеспечивают безопасное для типов программирование для кэширования результатов от использования методов stati c в System.Enum. В следующем примере выполняется поиск всех допустимых значений для типа enum, а затем создается словарь, который сопоставляет эти значения с его строковым представлением.

с примером:

    public static Dictionary<int, string> EnumNamedValues<T>() where T : System.Enum
    {
        var result = new Dictionary<int, string>();
        var values = Enum.GetValues(typeof(T));

        foreach (int item in values)
            result.Add(item, Enum.GetName(typeof(T), item));
        return result;
    }

Is есть ли какой-нибудь способ ограничить его перечислением, но также с помощью целых чисел c типов?

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/integral-numeric-types

пример

    public static Dictionary<int, string> EnumNamedValues<T>() where T : System.Enum (uint)
    {
        var result = new Dictionary<int, string>();
        var values = Enum.GetValues(typeof(T));

        foreach (int item in values)
            result.Add(item, Enum.GetName(typeof(T), item));
        return result;
    }

Приведенный выше синтаксис "System.Enum (uint)" не работает (или я, конечно, не задавал бы вопрос!) ....... но показывает намерение того, что я спрашиваю.

Спасибо.

1 Ответ

0 голосов
/ 02 марта 2020

как то так?:

    public enum Numbers
    {
            One = 1
            , Two
            , Three
            }

    ...
    ...
            public static Dictionary<int, string> EnumNamedValues<T>()
                    where T : unmanaged
            {
                    var result = new Dictionary<int, string>();
                    var values = Enum.GetValues(typeof(T));

                    foreach (int item in values)
                            result.Add(item, Enum.GetName(typeof(T), item));
                    return result;
            }
    ...
    ...


    //valid:
    var dictInt = EnumNamedValues<int>();
    var dictByte = EnumNamedValues<System.SByte>();
    var dictEnum = EnumNamedValues<Numbers>();
    //not valid
    var dictString = EnumNamedValues<string>();
...