C# 什么';按值检索自定义枚举类的正确方法是什么?

C# 什么';按值检索自定义枚举类的正确方法是什么?,c#,generics,c#-4.0,static-methods,C#,Generics,C# 4.0,Static Methods,我已经在我的域模型中创建了自己的自定义伪枚举,以允许我拥有一些更详细的值。例如,我的课程如下: public abstract class Enumeration<X, Y> : IComparable where X : IComparable { public Enumeration(X value, Y displayName) { } public Y DisplayName { get { return _displayName; } } pub

我已经在我的域模型中创建了自己的自定义伪枚举,以允许我拥有一些更详细的值。例如,我的课程如下:

public abstract class Enumeration<X, Y> : IComparable where X : IComparable
{

    public Enumeration(X value, Y displayName) { }

    public Y DisplayName { get { return _displayName; } }
    public X Value { get { return _value; } }

}
我开始为每个枚举类编写resolve方法,但肯定有比在每个枚举类中使用switch语句复制同一方法更好的方法

我考虑添加一个
字典缓存枚举
,我希望它作为
作业类型

因此,这意味着必须向枚举类添加第三个泛型类型,并具有:

public static T Resolve(X value); // With the additional type
public static T Resolve<T>(X value); // Or without an additional type
公共静态T解析(X值);//附加类型
公共静态T解析(X值);//或者没有附加类型

我显然不喜欢必须编写
JobType.Resolve(foo),我想要的只是
JobType.Resolve(foo),但应该用尽可能少的代码来完成。也就是说,所有这些都可以从基类处理,而不必包含额外的泛型类型吗?

这看起来像是。如果希望让基类型方法返回派生类而不强制转换,则可以将派生类型传递到基类型中,从而将派生类型约束为从基类型派生,例如

public abstract class Enumeration<TEnum, X, Y> : IComparable 
    where TEnum : Enumeration<TEnum, X, Y>
    where X : IComparable
{
    public static TEnum Resolve(X value) { /* your lookup here */ }

    // other members same as before; elided for clarity
}

如何在基类中存储值到实例的映射取决于您。听起来您似乎已经知道如何做到这一点,只是需要一些帮助来匹配类型。

您真正的枚举类可能比这更复杂,但您当前的实现看起来可以更简单地定义为标准枚举加上DAL模式,或者只是一本字典:

public enum JobType
{
    ChangeOver,
    Withdrawal,
    Installation,
}

// Maybe inside some DAL-pattern/database parsing class:
var databaseToJobTypeMap = new Dictionary<string, JobType>()
{
    { "XY01", JobType.ChangeOver },
    // ...
};
公共枚举作业类型
{
转换,
撤回
安装,
}
//可能在某些DAL模式/数据库解析类中:
var databaseToJobTypeMap=新字典()
{
{“XY01”,JobType.change},
// ...
};
将解析代码保持在一起(可能带有一个接口抽象)可以让您在数据存储格式/需要更改时,或者在您最终拥有多个数据源时切换解析器

如果需要解析实际的JobType值(例如,字符串“转换”或整数表示),则可以使用Enum.parse/Enum.TryParse或casting


您使用的实现似乎更加不灵活,因为它将枚举类型锁定为一种字典映射样式/表示形式。

是否有过Y不是字符串的情况?@Henk-是的,但它可能永远不会比int更复杂。有没有办法实现同样的效果,但是没有额外的泛型?@GenericTypeTea-我想不出,不。好吧,我已经在我的问题中给出了一个可能的答案,但接受并+1,因为这似乎是唯一可行的解决方案。
public abstract class Enumeration<TEnum, X, Y> : IComparable 
    where TEnum : Enumeration<TEnum, X, Y>
    where X : IComparable
{
    public static TEnum Resolve(X value) { /* your lookup here */ }

    // other members same as before; elided for clarity
}
public class JobType : Enumeration<JobType, string, string>
{
    // other members same as before; elided for clarity
}
JobType type = JobType.Resolve("XY01");
public enum JobType
{
    ChangeOver,
    Withdrawal,
    Installation,
}

// Maybe inside some DAL-pattern/database parsing class:
var databaseToJobTypeMap = new Dictionary<string, JobType>()
{
    { "XY01", JobType.ChangeOver },
    // ...
};