将枚举值映射到类

时间:2015-09-29 15:30:12

标签: c# enums

我希望能够将Enum的每个值映射到不同的class(反之),但保持关系存储在一个位置,以便可以更改/添加到无需在多个位置进行更改。

哪种模式允许我将枚举值映射到类?

我的具体用法大致如下:

我有一个Person课程,其中包含有关此人的一般信息。可以向该类添加组件(存储在 List Dictionary中),其中包含特定于特定类型的人的信息,例如。 componentCustomercomponentEndUsercomponentSupplier。这些组件类实现了IPersonComponent接口。重要的是,一个人可以是多种类型,因此可以拥有多个组件

我还有一个枚举ePersonType,例如。客户,最终用户,供应商。每个值与组件具有一对一的关系。

当检索到某人的记录时,会使用适当的“ePersonType”值填充List<int>。然后使用此列表确定需要将哪些组件分配给Person并加载数据。

显然,switch对于人的类型并且适当地添加组件是直截了当的。但是,如果我以后想要检查person实例包含哪些组件以及它们是ePersonType,该怎么办?我可以switch回到component.GetType(),但后来我将关系存储在两个地方。

或者,我可以在每个组件中存储适当的ePersonType并使用Linq来检查一个人实例是否具有特定组件,但是看起来原始分配似乎更复杂,可能需要反射? / p>

我确信我错过了一些非常明显的东西。

1 个答案:

答案 0 :(得分:1)

我接触过的方法之一是在实际枚举值上使用属性:

public enum PersonType
{
  [PersonClass(typeof(Customer)]
  Customer,

  [PersonClass(typeof(EndUser)]
  EndUser,

  [PersonClass(typeof(Supplier)]
  Supplier,
}

public class PersonClassAttribute : System.Attribute 
{
    public Type Type { get; }

    public PersonClassAttribute(Type type)
    {
        Type = type;
    }
}

然后使用静态类来管理枚举到类型的检索和映射:

public static class People
{
    static Dictionary<PersonType, Type> mapping = new Dictionary<PersonType, Type>();

    static People()
    {
        var fields = Enum.GetNames(typeof(PersonType)).Select(n => typeof(PersonType).GetFieldr(n));
        mapping = fields.ToDictionary(
            f => (PersonType)f.GetRawConstantValue(),
            f => f.GetCustomAttribute<PersonClassAttribute>().Type
            );
    }


    public static T GetPersonInstance<T>(this PersonType type)
    {
       return (T)Activator.CreateInstance(mapping[type]);
    }
}

显然它会有更多(验证,错误检查等),但这是一般的想法。