C# 运行时编译的部分枚举-可选

C# 运行时编译的部分枚举-可选,c#,roslyn,C#,Roslyn,我想做一些类似于部分枚举的事情。如果我知道C#不支持这一点。我的想法是在MyClass2中编写Dictionary。Dictionary包含一些从文件加载的属性,我希望能够添加一些其他“属性”(PartialEnum的成员)。我使用的是Roslyn,所以我可以在运行时编译枚举的一些“第二”部分,但不知道怎么做。(部分静态类也不受支持,因此我无法使用公共只读成员) 和运行时编译部分 partial enum PartialEnum{ runTimeLasName, runTimeTi

我想做一些类似于
部分枚举的事情。如果我知道C#不支持这一点。我的想法是在
MyClass2
中编写
Dictionary
。Dictionary包含一些从文件加载的属性,我希望能够添加一些其他“属性”(PartialEnum的成员)。我使用的是Roslyn,所以我可以在运行时编译枚举的一些“第二”部分,但不知道怎么做。(
部分静态类
也不受支持,因此我无法使用
公共只读
成员)

和运行时编译部分

partial enum PartialEnum{     
 runTimeLasName,
 runTimeTitle, ...
}

在我看来,这里实际上不需要
enum
。您希望在运行时向它添加一些值,这意味着
enum
不适合您的需要。但是您可以创建一个这样做的类。比如:

partial enum PartialEnum{
 Name,
 Group, ...
}
class PartialEnum
{
    private static readonly Dictionary<string, PartialEnum> Values =
        new Dictionary<string, PartialEnum>();

    public string Id { get; private set; }

    private PartialEnum(string id)
    {
        Id = id;
    }

    public static PartialEnum GetValue(string id)
    {
        PartialEnum value;
        if (!Values.TryGetValue(id, out value))
        {
            value = new PartialEnum(id);
        }

        return value;
    }

    public static PartialEnum Name { get { return GetValue("Name"); } }

    public static PartialEnum Group { get { return GetValue("Group"); } }
}
class PartialEnum
{
私有静态只读字典值=
新字典();
公共字符串Id{get;private set;}
私有部分名称(字符串id)
{
Id=Id;
}
公共静态PartialEnum GetValue(字符串id)
{
部分价;
如果(!Values.TryGetValue(id,out值))
{
值=新的PartialEnum(id);
}
返回值;
}
公共静态partialnum名称{get{return GetValue(“Name”);}
公共静态partialnum组{get{return GetValue(“Group”);}
}

如果要使用其中一个预定义值,请访问静态属性(例如,
PartialEnum.Name
)。如果要使用运行时定义的值,请使用
GetValue()
方法(例如
PartialEnum.GetValue(“runTimeLastName”)

enum
在编译时提供对命名值的支持。您试图从运行时编译它们中获得什么好处?任何接受
enum
的代码实际上只是接受
enum
使用的任何值,在C中,默认值为
int
。如果将相关值提供为在获取类型的方法的条目上将其强制转换为枚举类型,则可以在运行时使用动态枚举值,而无需进行任何编译。它不会与任何已知值关联,但会保留其基础值。在运行时,您无论如何都不会关心这个问题。
支持静态部分类
。但我不确定这是否会对您有所帮助,因为您不能在编译时创建类的一部分,然后在运行时向其中添加一些内容。
class PartialEnum
{
    private static readonly Dictionary<string, PartialEnum> Values =
        new Dictionary<string, PartialEnum>();

    public string Id { get; private set; }

    private PartialEnum(string id)
    {
        Id = id;
    }

    public static PartialEnum GetValue(string id)
    {
        PartialEnum value;
        if (!Values.TryGetValue(id, out value))
        {
            value = new PartialEnum(id);
        }

        return value;
    }

    public static PartialEnum Name { get { return GetValue("Name"); } }

    public static PartialEnum Group { get { return GetValue("Group"); } }
}