Включить общий <T> - PullRequest
       69

Включить общий <T>

0 голосов
/ 10 июня 2019

У меня есть несколько списков, которые я хочу сохранить как статические, поэтому они имеют явное имя.

Gender, MaritalStatus и ResidentalStatus - все перечислимые типы.

static readonly Lazy<IEnumerable<EnumDto>> _gender = GetLazyOptions<Gender>();
static readonly Lazy<IEnumerable<EnumDto>> _maritalStatus = GetLazyOptions<MaritalStatus>();
static readonly Lazy<IEnumerable<EnumDto>> _residentalStatus = GetLazyOptions<ResidentialStatus>();

Мне нужно иметь доступ к соответствующему полю, используя универсальный метод - что-то вроде приведенного ниже:

public static IEnumerable<EnumDto> GetOption1<TEnum>() where TEnum : Enum
{
}

public static IEnumerable<EnumDto> GetOptions2<TEnum>(this TEnum @enum) where TEnum : Enum
{
}

Идея состоит в том, чтобы затем использовать оператор switch, чтобы найти правильноеполе (из типа Enum), но пока я не смог заставить его работать для меня синтаксически:

switch(typeof(@enum))
{
    case Gender: return _gender;
}

Я уже проверил этот поток, но безуспешно:

c # 7.0: включить System.Type

Любой совет приветствуется.

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Возможно, попробуйте сделать что-то вроде этого:

public class Dtos
{
    private Dictionary<Type, Func<IEnumerable<EnumDto>>> _lists
        = new Dictionary<Type, Func<IEnumerable<EnumDto>>>();

    public void Add<T>(Func<IEnumerable<EnumDto>> factory)
    {
        _lists[typeof(T)] = factory;
    }

    public IEnumerable<EnumDto> Get<T>()
    {
        return _lists[typeof(T)]();
    }
}

Затем вы можете настроить Dtos следующим образом:

var dtos = new Dtos();

dtos.Add<Gender>(() => _gender.Value);
dtos.Add<MaritalStatus>(() => _maritalStatus.Value);
dtos.Add<ResidentialStatus>(() => _residentalStatus.Value);

А потом их получить просто:

IEnumerable<EnumDto> genderDtos = dtos.Get<Gender>();
IEnumerable<EnumDto> maritalStatusDtos = dtos.Get<MaritalStatus>();
IEnumerable<EnumDto> residentialStatusDtos = dtos.Get<ResidentialStatus>();
0 голосов
/ 10 июня 2019

Нашел ответ благодаря mjwills здесь

    public static IEnumerable<EnumDto> GetOptions<TEnum>() where TEnum : Enum
    {
        var type = typeof(TEnum);
        switch (type)
        {
            case Type _ when type == typeof(Gender):
                return _gender.Value;
            default:
                return _maritalStatus.Value;
        }
    }

Однако, взглянув на ответ из Enigmativity , я решил реализовать решение, основанное на его гораздо более чистой концепции.

...