Динамическое добавление свойства в класс на основе вывода Json - PullRequest
0 голосов
/ 17 октября 2018

У меня есть строка JSON, где записи могут меняться.Я использую public partial classes для каждого уровня в моей строке JSON.Я копирую его в DataTable, так как он мне нужен на моем SQL-сервере.Я вызываю 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, адрес, город, PostcalCode

Мой класс теперь выглядит так:

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; }

Как бы я сделал этот Dynamic?Я действительно понятия не имею.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вы можете создать класс с помощью 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;
    }
0 голосов
/ 17 октября 2018

Вы можете использовать dynamic тип данных вместо класса.вот пример использования Json.net

JObject obj = JsonConvert.DeserializeObject("{ 'Name': 'Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 28 }");

var properties = obj.Properties();
foreach (var prop in properties)
{
    string key = prop.Name;
    object value = prop.Address;
    int age = prop.Age;         
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...