Тип объекта T, определенный другой строкой в ​​том же классе - PullRequest
0 голосов
/ 30 марта 2020

Я извлекаю некоторые данные из внешнего API, и у них есть некоторые объекты, определенные строкой дискриминатора.

Примером является массив объектов «Включить», каждый из которых может иметь свой тип объекта как параметр Attributes.

public class Include
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("attributes")]
    public T Attributes { get; set; }
}

Как определить тип объекта T на основе значения параметра Type?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Вы можете определить Атрибуты как JObject, затем сделать .ToObject, основываясь на значении типа.

public class Include
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("attributes")]
    public JObject Attributes { get; set; }
}

Затем выполните оператор if (или switch) для обработки каждого типа:

if (include.Type == "TypeOne")
  ProcessTypeOne(include.Attributes.ToObject<TypeOne>());
else
  ...

Это предполагает, что у вас есть класс, определенный для каждого возможного "Типа". Или вы можете обрабатывать их так, как вам нужно, просто преобразовав Атрибуты в необходимый тип с помощью метода .ToObject <> ().

0 голосов
/ 30 марта 2020

Вы можете сделать что-то , например, :

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        //setup
        var a = new Include{Type = "Baz", Attributes = new Baz{Prop1 = "hello"}};
        //convert
        var b = Convert.ChangeType(a.Attributes, Type.GetType(a.Type));
        //use
        Console.WriteLine(b.Prop1);
    }
}

public class Include
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("attributes")]
    public dynamic Attributes { get; set; }
}

public class Baz
{
    public string Prop1 { get; set; }
}

Convert.ChangeType позволит вам преобразовать объект Dynami c в любой тип, которым он должен быть. Однако вы все равно можете обнаружить, что находитесь в том же месте, что и @ ответ BraianM , и вам придется ввести проверку, чтобы вы знали, что свойство или метод есть.

Вы также можете посмотреть на JsonConverter . Возможно, там есть что-то, что могло бы помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...