C# 将枚举值映射到类

C# 将枚举值映射到类,c#,enums,C#,Enums,我希望能够将枚举的每个值映射到不同的类(反之亦然),但要将关系存储在一个位置,以便在不在多个位置进行更改的情况下对其进行更改/添加 什么模式允许我将枚举值映射到类? 我的具体用法大致如下: 我有一个Person类,它保存有关此人的一般信息。可以向此类添加组件(存储在列表字典),这些组件包含特定类型人员的特定信息,例如组件客户,组件终端用户,组件供应商。这些组件类实现了一个IPersonComponent接口。重要的是,一个人可以是多个类型,因此可以持有多个组件 我还有一个EnumePersonT

我希望能够将
枚举
的每个值映射到不同的
(反之亦然),但要将关系存储在一个位置,以便在不在多个位置进行更改的情况下对其进行更改/添加

什么模式允许我将枚举值映射到类?

我的具体用法大致如下:

我有一个
Person
类,它保存有关此人的一般信息。可以向此类添加组件(存储在<代码>列表<代码>字典<代码>),这些组件包含特定类型人员的特定信息,例如<代码>组件客户<代码>,<代码>组件终端用户<代码>,<代码>组件供应商<代码>。这些组件类实现了一个
IPersonComponent
接口。重要的是,一个人可以是多个类型,因此可以持有多个组件

我还有一个Enum
ePersonType
值,例如Customer、End User、Supplier。每个值都与组件具有一对一的关系

检索个人记录时,将使用适当的“ePersonType”值填充
列表。然后,此列表用于确定需要分配给
人员并加载数据的组件

显然,在人的类型上切换
并适当添加组件是很简单的。但是,如果我以后想检查person实例包含哪些组件以及它们是什么?我可以
重新打开
组件.GetType()
,但是我将关系存储在两个地方

或者,我可以在每个组件中存储适当的
ePersonType
,并使用Linq检查person实例是否有特定的组件,但这样看来原始分配会更复杂,可能需要反射


我确信我在这里遗漏了一些非常明显的东西。

我实现这一点的方法之一是对实际枚举值使用属性:

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]);
    }
}
公共静态类人物
{
静态字典映射=新字典();
静态人()
{
var fields=Enum.GetNames(typeof(PersonType)).Select(n=>typeof(PersonType).GetFieldr(n));
mapping=fields.ToDictionary(
f=>(PersonType)f.GetRawConstantValue(),
f=>f.GetCustomAttribute().Type
);
}
公共静态T GetPersonInstance(此PersonType类型)
{
返回(T)Activator.CreateInstance(映射[type]);
}
}

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

字典在这里可能很好?我认为,您需要将代码从使用枚举改为多态性。我可以看到如何使用字典将每个枚举值映射到类的实例,但我不知道如何处理类本身?enum(在每种编程语言中)的一般意义是相当静态的(即关联是但不变)。当然,也有可能封装到enum动态现实中,但似乎使用了错误的样式。如果我想在C#中实现这样的想法,扩展方法似乎是最好的。但看评论,这个想法相当糟糕