C# T对象类型由同一类中的另一个字符串定义

C# T对象类型由同一类中的另一个字符串定义,c#,C#,我从外部API中提取一些数据,它们有一些由鉴别器字符串定义的对象 例如,“包含”对象数组,其中每个对象都可以有不同类型的对象作为属性参数 public class Include { [JsonProperty("type")] public string Type { get; set; } [JsonProperty("attributes")] public T Attributes { get; set; } } 如何根据type参数的值定义对象类型T

我从外部API中提取一些数据,它们有一些由鉴别器字符串定义的对象

例如,“包含”对象数组,其中每个对象都可以有不同类型的对象作为属性参数

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

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

如何根据
type
参数的值定义对象类型T?

您可以将属性定义为JobObject,然后根据类型值执行.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
  ...
if(include.Type==“TypeOne”)
ProcessTypeOne(include.Attributes.ToObject());
其他的
...
这是假设您为每个可能的“类型”定义了一个类。或者,您可以根据需要处理它们,只需通过.ToObject()方法将属性转换为必要的类型。

您可以执行以下操作:

Convert.ChangeType
允许您将动态对象转换为所需的任何类型。但是,您可能仍然会发现您与处于相同的位置,并且必须键入check,以便知道存在属性或方法


你也可以看看。也许有些东西会有所帮助。

Newtonsoft.Json或System.Text.Json?您需要类似Type=“Foo”的东西,以便执行Attributes.Bar?其中Bar是一个名为Baz的类的属性?@Eonasdan Yep,确切地说…@aepot Newtonsoft.JsonHmm好的,但是在解析这个对象的任何地方都必须这样做,对吧?是的,但我真的看不出你将如何避免这种情况,即使你可以使用泛型来定义它。每次你使用它,你不需要知道它的类型并相应地使用它吗。。除此之外,他们的API中有很多这样的应用程序,而且它们通常在模型中使用得相当深入,因此每个API请求都需要相当多的自定义代码。
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; }
}