【问题标题】:Switch on generic <T>打开通用 <T>
【发布时间】:2019-06-10 09:28:39
【问题描述】:

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

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

任何建议表示赞赏。

【问题讨论】:

  • stackoverflow.com/a/43080709/34092 为你工作了吗?
  • 枚举本质上是整数(它们基本上是分配了整数值的标签)。
  • 任何你不能 .ToString() 他们并打开字符串值的原因(我假设你想打开一个通用枚举,因为你有多个枚举,具有相同的名称或名称在他们中间重复?)
  • 如果您能提供minimal reproducible example,那就太好了。
  • static 字段中存储这样的内容通常是个坏主意。你为什么要这样做?

标签: c# enums switch-statement


【解决方案1】:

也许尝试做这样的事情:

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>();

【讨论】:

  • 感谢您的努力 Enigmativity,我会看看它是否适合其余的设置。
  • @JohnOhara - 只有回答问题才重要。如果它不适合您的设置,也许您应该考虑如何更改您的问题以考虑适合的因素?
  • 我有一个原始问题的答案,我会发布,但我已经根据您的解决方案实施了一个更简洁的版本 - 所以标记您
【解决方案2】:

感谢 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 的答案后,我决定根据他更清晰的概念实施一个解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 2016-01-09
    • 1970-01-01
    • 2020-06-15
    • 2012-05-14
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多