开启通用<T>

时间:2019-06-10 09:28:39

标签: c# enums switch-statement

我有许多要存储为静态变量的列表,因此它们被明确命名。

GenderMaritalStatusResidentalStatus都是枚举类型。

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: switch on System.Type

任何建议表示赞赏。

2 个答案:

答案 0 :(得分:1)

也许尝试做这样的事情:

return

然后您可以像这样配置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);

答案 1 :(得分:0)

感谢 mjwills here

找到了答案
    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 的答案后,我决定根据他更简洁的概念实施解决方案。