Enum可以完全序列化吗?

时间:2010-06-27 23:23:24

标签: .net javascript serialization

我在WCF上运行了一个.NET应用程序。在该应用程序中,我定义了各种“类型”(“CourseType”,“PresentationType”,“HierarchyType”等)作为枚举。这些会自动与数据库同步,因此我可以编写好的代码,如:

public enum CourseType {
  Online = 1, 
  Classroom = 2
}

...

if(course.Type == CourseType.Online) {
  // do stuff on the server
}

我想知道是否有人知道序列化整个枚举的好方法,所以我可以在JavaScript中编写类似的语句。

请注意,我询问是否仅序列化该值。我想要的是最终得到某种类似于以下的JavaScript对象:

CourseType = {
  'online' : 1,
  'classroom': 2
};

我知道,我可以通过反思做到这一点,但我希望有一种内置的解决方案......

2 个答案:

答案 0 :(得分:1)

如果枚举是相对静态的并且不会经常更改,那么在我看来,使用具有匿名类型的JSON序列化程序非常有效:

new { CourseType.Online, CourseType.Classroom }

但如果您正在寻找能够处理动态或多个枚举而无需维护的东西,您可以创建一些迭代名称值对的东西,并创建一个要序列化的字典(不需要反射)。

public static IDictionary<string, int> ConvertToMap(Type enumType)
{
  if (enumType == null) throw new ArgumentNullException("enumType");
  if (!enumType.IsEnum) throw new ArgumentException("Enum type expected", "enumType");

  var result = new Dictionary<string, int>();
  foreach (int value in Enum.GetValues(enumType))
    result.Add(Enum.GetName(enumType, value), value);

  return result;
}

修改

如果你需要一个JSON Serializer ......我真的很喜欢使用JSON.NET http://james.newtonking.com/projects/json-net.aspx

答案 1 :(得分:0)

这里你去:

private enum CourseType
{
    Online = 1,
    Classroom = 2
}

private void GetCourseType()
{
    StringBuilder output = new StringBuilder();

    string[] names =
        Enum.GetNames(typeof(CourseType));

    output.AppendLine("CourseType = {");
    bool firstOne = true;
    foreach (string name in names)
    {
        if (!firstOne)
            output.Append(", " + Environment.NewLine);
        output.Append(string.Format("'{0}' : {1:N0}", name, (int)Enum.Parse(typeof(CourseType), name)));

        firstOne = false;
    }
    output.AppendLine(Environment.NewLine + "}");

    // Output that you could write out to the page...
    Debug.WriteLine(output.ToString());
}

输出:

CourseType = {
'Online' : 1, 
'Classroom' : 2
}