代码之家  ›  专栏  ›  技术社区  ›  djdd87

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

  •  2
  • djdd87  · 技术社区  · 14 年前

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

    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; } }
    
    }
    

    继承它的类是:

    public class JobType : Enumeration<string, string>
    {
        public static JobType ChangeOver = new JobType("XY01", "Changeover");
        public static JobType Withdrawal = new JobType("XY02", "Withdrawal");
        public static JobType Installation = new JobType("XY03", "Installation");
    
        private JobType(string jobTypeId, string description)
            : base(jobTypeId, description) { }
    }
    

    我遇到的问题是,我希望能够从存储库中的数据库返回的值中解析这些值。所以我想要一种方法,比如:

    public static JobType Resolve(string jobTypeId) { return matchingJobType; }
    

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

    我想加一个 Dictionary<X, Enumeration<X, Y>> Cache; Enumeration<X, Y> 我想把它当作 JobType

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

    public static T Resolve(X value); // With the additional type
    public static T Resolve<T>(X value); // Or without an additional type
    

    我显然不喜欢非写不可的想法 JobType.Resolve<JobType>(foo); 我想要的只是 JobType.Resolve(foo);

    2 回复  |  直到 14 年前
        1
  •  3
  •   Greg Beech    14 年前

    这看起来像是一个 curiously recurring template pattern . 如果想让基类型方法返回派生类而不强制转换,那么可以将派生类型传递到基类型中,将派生类型约束为从基类型派生,例如。

    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
    }
    

    Resolve 方法。

    JobType type = JobType.Resolve("XY01");
    

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

        2
  •  0
  •   Merlyn Morgan-Graham    14 年前

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

    当您的数据存储格式/需要更改时,或者如果您最终拥有多个数据源时,将解析代码保持在一起(可能带有接口抽象)可以让您选择切换解析器。

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

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