我希望能够将Enum
的每个值映射到不同的class
(反之),但保持关系存储在一个位置,以便可以更改/添加到无需在多个位置进行更改。
哪种模式允许我将枚举值映射到类?
我的具体用法大致如下:
我有一个Person
课程,其中包含有关此人的一般信息。可以向该类添加组件(存储在 List
Dictionary
中),其中包含特定于特定类型的人的信息,例如。 componentCustomer
,componentEndUser
,componentSupplier
。这些组件类实现了IPersonComponent
接口。重要的是,一个人可以是多种类型,因此可以拥有多个组件。
我还有一个枚举ePersonType
,例如。客户,最终用户,供应商。每个值与组件具有一对一的关系。
当检索到某人的记录时,会使用适当的“ePersonType”值填充List<int>
。然后使用此列表确定需要将哪些组件分配给Person
并加载数据。
显然,switch
对于人的类型并且适当地添加组件是直截了当的。但是,如果我以后想要检查person实例包含哪些组件以及它们是ePersonType
,该怎么办?我可以switch
回到component.GetType()
,但后来我将关系存储在两个地方。
或者,我可以在每个组件中存储适当的ePersonType
并使用Linq来检查一个人实例是否具有特定组件,但是看起来原始分配似乎更复杂,可能需要反射? / p>
我确信我错过了一些非常明显的东西。
答案 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]);
}
}
显然它会有更多(验证,错误检查等),但这是一般的想法。