将嵌套的c#-type转换为json并在javascript

时间:2016-02-18 08:52:21

标签: javascript c# json reflection deep-copy

我有一个C#类作为应用程序使用的常量值的容器。

public abstract class MyConstants
{
    public abstract class HttpMethods
    {
        public const string Put = "PUT";
        public const string Post = "POST";
        public const string Get = "GET";
    }

    public abstract class ContainerKeys
    {
        public abstract class GlobalModal
        {
            public const string DialogId = "6698CB2F-2948-45D9-8902-2C13A7ED6335";
        }
    }

    public const int MaximumImageUploadSize = 3 * 1024 * 1024; // 3MB
    public const int MaximumDocumentUploadSize = 5 * 1024 * 1024; // 5MB
}

如何将其转换为json,然后将其复制到javascript - 文件中,以便像MyConstants.HttpMethods.Put内的javascript一样使用它?

使用

var constants = typeof(MyConstants).GetFields().ToDictionary(x => x.Name, x => x.GetValue(null));
var json = new JavaScriptSerializer().Serialize(constants);
return JavaScript(json + ";");

仅在没有所有嵌套类/常量的情况下返回{"MaximumImageUploadSize":3145728,"MaximumDocumentUploadSize":5242880};

问题似乎与使用muliple嵌套其他Type的{​​{1}}上的反射更相关。

2 个答案:

答案 0 :(得分:1)

您的public abstract class MyConstants { public class HttpMethods { public const string Put = "PUT"; public const string Post = "POST"; public const string Get = "GET"; } public const int MaximumImageUploadSize = 3 * 1024 * 1024; // 3MB public const int MaximumDocumentUploadSize = 5 * 1024 * 1024; // 5MB public const HttpMethods HttpMethodObj; } 课程中没有课程实例。这就是它不可见的原因。

以下简化示例:

<input id="radio2" type="radio" value="2" name="radio" checked>

答案 1 :(得分:0)

您需要提交递归来构建字典:

实施例

Dictionary<string, object> TypeToDictionary(Type type)
{
    var ret = type.GetFields().ToDictionary(x => x.Name, x => x.GetValue(null));

    foreach (var nestedType in type.GetNestedTypes())
    {
        ret.Add(nestedType.Name, TypeToDictionary(nestedType));
    }

    return ret;
}

用法

var dictionary = TypeToDictionary(typeof(MyConstants));
var json = JsonConvert.SerializeObject(dictionary, Newtonsoft.Json.Formatting.Indented);

输出

{
  "MaximumImageUploadSize": 3145728,
  "MaximumDocumentUploadSize": 5242880,
  "HttpMethods": {
    "Put": "PUT",
    "Post": "POST",
    "Get": "GET"
  },
  "ContainerKeys": {
    "GlobalModal": {
      "DialogId": "6698CB2F-2948-45D9-8902-2C13A7ED6335"
    }
  }
}

注意

我使用了Newtonsoft.JSON,但JavaScriptSerializer也可以使用。