在运行时编译的部分枚举 - 替代

时间:2013-04-22 09:00:55

标签: c# roslyn

我想做partial enum之类的事情。如果我知道C#不支持这个。我的想法是在Dictionary<PartialEnum, MyClass>MyClass2。字典包含从文件加载的一些属性,我希望有可能添加一些其他“属性”(PartialEnum成员)。我正在使用Roslyn,所以我可以在运行时编译 enum 的一些“第二”部分,但不知道该怎么做。 (partial static class也不受支持,因此我无法使用public readonly成员)

MyClass{
  string value;

  public string Value{
     get{ return value;}
  }
}

MyClass2{

  private Dictionary<PartialEnum,MyClass> properties;

}

我可以使用string之类的键,但它不是很好。所以可以做类似的事情:

partial enum PartialEnum{
 Name,
 Group, ...
}

和运行时编译的部分

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

1 个答案:

答案 0 :(得分:2)

在我看来,你实际上并不需要enum。您希望在运行时向其添加一些值,这意味着enum不符合您的需求。但是你可以创建一个类。类似的东西:

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

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