这是我的代码:
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。
有没有办法以编程方式设置静态变量,例如使用forecach
或while
?
编辑: @subi_speedrunner评论和@ T.J.Crowder回复,我搜索了Reflection
,我编码如下:
但它给出了一个错误。我不明白为什么?
答案 0 :(得分:1)
是的,您可以使用System.Reflection
命名空间中定义的反射。粗略草图:
Type
和Arac
x
个对象
Type
对象获取Arac
GetProperties
和/或GetFields
方法所有属性/字段的数组(您可以指定各种功能,例如是否只需要公共功能等)。FieldInfo
PropertyInfo
个对象的Arac
/ Type
个对象,请使用Type#GetField
或{/ 3}}(或他们的一个亲戚)得到它FieldInfo
PropertyInfo
个x
对象的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);
}
}