有没有办法在foreach循环中创建?

时间:2016-01-24 08:25:05

标签: c# json dynamic foreach while-loop

这是我的代码:

        var json = File.ReadAllText(@"C:\sira.json");
        dynamic x = JsonConvert.DeserializeObject<dynamic>(json);
        Arac.adli_tip = x.adli_tip;
        Arac.aile_hukuku = x.aile_hukuku;
        Arac.avrupa_birligi_hukuku = x.avrupa_birligi_hukuku;
        Arac.bankacilik_hukuku = x.bankacilik_hukuku;
        Arac.bilisim_hukuku = x.bilisim_hukuku;
        Arac.borclar_hukuku = x.borclar_hukuku;
        Arac.cevre_hukuku = x.cevre_hukuku;
        Arac.deniz_ticareti_hukuku = x.deniz_ticareti_hukuku;
        Arac.devletler_ozel_hukuku = x.devletler_ozel_hukuku;
        Arac.esya_hukuk = x.esya_hukuk;
         .
         .
         .

sira.json是关于我的winforms应用程序的配置文件。 以下是sira.json文件的内容:

{
  "adli_tip": 15,
  "aile_hukuku": 43,
  "avrupa_birligi_hukuku": 22,
  "bankacilik_hukuku": 10,
  .
  .
  .
  "vergi_hukuku": 3
}

我想从文件中获取一些值并设置静态变量。但这些配置变量接近60。 有没有办法以编程方式设置静态变量,例如使用forecachwhile

编辑: @subi_speedrunner评论和@ T.J.Crowder回复,我搜索了Reflection,我编码如下: enter image description here

但它给出了一个错误。我不明白为什么?

2 个答案:

答案 0 :(得分:1)

是的,您可以使用System.Reflection命名空间中定义的反射。粗略草图:

  • 获取TypeArac
  • x个对象
  • 拥有一系列您要处理的字段名称,或使用Type对象获取Arac GetProperties和/或GetFields方法所有属性/字段的数组(您可以指定各种功能,例如是否只需要公共功能等)。
  • 遍历数组或列表以及每个字段:
    • 如果您还没有来自FieldInfo PropertyInfo个对象的Arac / Type个对象,请使用Type#GetField或{/ 3}}(或他们的一个亲戚)得到它
    • 获取同一字段/属性的FieldInfo PropertyInfox对象的Type / GetValue
    • 使用从FieldInfo类型对象获得的PropertyInfo / x的{​​{1}}方法来读取值,并使用{ {1}}另一个SetValue / FieldInfo对象的方法将值写入PropertyInfo

不一定说它是个好主意,因为只要你将这些字段名称放入字符串中,就会更难用工具等来重构它们,但如果问题是&#34;我可以吗?这样做?&#34;答案是&#34;是&#34; (有时它是一个合理的选择,只需要权衡取舍)。

答案 1 :(得分:1)

假设Arac属性名称与json属性名称完全匹配,Arac属性属于public static属性,则以下代码将起作用:

using Newtonsoft.Json.Linq;
using System;

namespace ConsoleApplication1
{

    public static class Arac
    {
        public static int adli_tip { get; set; }
        public static int aile_hukuku { get; set; }
        public static int avrupa_birligi_hukuku { get; set; }
        public static int bankacilik_hukuku { get; set; }


        public static string string_value {get; set;}
        public static DateTime date_value { get; set; }

    }

    class Program
    {
        static void Main(string[] args)
        {
            var json = @"
{
  ""adli_tip"": 15,
  ""aile_hukuku"": 43,
  ""avrupa_birligi_hukuku"": 22,
  ""bankacilik_hukuku"": 10,

""string_value"": ""some value"",
""date_value"": ""2016-01-24 11:18:00""
}";
            JObject arac = JObject.Parse(json);
            foreach (var prop in typeof(Arac).GetProperties(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public))
            {
                var token = arac.GetValue(prop.Name);
                if (token != null)
                { 
                    object value = token.ToObject(prop.PropertyType);
                    prop.SetValue(null, value, null);
                }
            }

            Console.WriteLine("adli_tip {0}", Arac.adli_tip);
            Console.WriteLine("aile_hukuku {0}", Arac.aile_hukuku);
            Console.WriteLine("avrupa_birligi_hukuku {0}", Arac.avrupa_birligi_hukuku);
            Console.WriteLine("bankacilik_hukuku {0}", Arac.bankacilik_hukuku);
            Console.WriteLine("string_value {0}", Arac.string_value);
            Console.WriteLine("date_value {0}", Arac.date_value);
        }
    }
}

请注意,我直接使用JObject代替JsonConvert.DeserializeObject,这是因为JsonConvert.DeserializeObject<dynamic>实际上返回JObject,我更喜欢JObject的所有功能使用通用dynamic对象。

代码使用整数属性以及其他类型的属性,如示例代码所示。

以下是相关代码:

JObject arac = JObject.Parse(json);
foreach (var prop in typeof(Arac).GetProperties(BindingFlags.Static |  BindingFlags.Public))
{
    var token = arac.GetValue(prop.Name);
    if (token != null)
    { 
        object value = token.ToObject(prop.PropertyType);
        prop.SetValue(null, value, null);
    }
}