基于Json输出向类动态添加属性

时间:2018-10-17 12:04:23

标签: c# json sql-server class dynamic

我有一个JSON字符串,可以在其中更改记录。我在JSON字符串中使用的每个级别都使用public partial classes。我将其复制到DataTable,因为我的SQL Server中需要它。我这样叫JSON:

StringReader sr = new StringReader(json);
Newtonsoft.Json.JsonTextReader readera = new JsonTextReader(sr);
object result = (Welcome)jsona.Deserialize(readera,typeof(Welcome));

Welcome w = (Welcome)result;

DataTable da = w.Result.Records.ToDataTable(); 

例如,我的JSON可以包含:

  

ID,名称,值

但是其他JSON可能包含:

  

ID,地址,城市,邮政编码

我的班级现在看起来像这样:

public partial class Record
{
    [JsonProperty("Col1")]
    public DateTimeOffset Col1 { get; set; }

    [JsonProperty("Col2")]
    public long Col2 { get; set; }

    [JsonProperty("Col3")]
    public DateTimeOffset Col3 { get; set; }

    [JsonProperty("Col4")]
    public long Col4 { get; set; }

    [JsonProperty("Col5")]
    public string Col5 { get; set; }

我将如何使其动态?我真的没有头绪。

2 个答案:

答案 0 :(得分:1)

您可以使用print("foo") # raises exception print "foo" # doesn't work either print # doesn't raise any exception, but I want it to foo = print # this shouldn't work either like the one above, but it does 数据类型代替类。这里的示例使用dynamic

Json.net

答案 1 :(得分:1)

您可以通过string创建一个类,并在运行时对其进行编译和加载,并通过反射来设置值。

在此示例中,我将新类简化为一个属性。

public Type BuildType(string propertyName)
    {
        var code = @"
            using System;
            namespace MyNamespace
            {
                public class MyClass
                {
                    public object " + propertyName + @" { get; set; }
                }
            }";

        var provider = new CSharpCodeProvider();
        var parameters = new CompilerParameters
        {
            GenerateInMemory = true,
            GenerateExecutable = false
        };

        var results = provider.CompileAssemblyFromSource(parameters, code);

        // Check Errors
        if (results.Errors.HasErrors)
        {
            var sb = new StringBuilder();
            foreach (CompilerError error in results.Errors) 
            {
                sb.AppendLine(string.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText));
            }
            throw new InvalidOperationException(sb.ToString());
        }
        var assembly = results.CompiledAssembly;
        var classInstance = assembly.GetType("MyNamespace.MyClass");

        return classInstance;
    }