具有属性的类,可以是两种不同类型之一

Azi*_*uth 5 c# class telegram-bot

我正在用C#开发一个Telegram机器人但是在实现Message类型方面有困难.根据API文档,chat字段可以是类型User或类型GroupChat.我如何在C#中实现它?

到目前为止,我只能使用以下代码提出以下代码Newtonsoft.Json:

public class Update {
....
  [JsonProperty("chat")]
  public User chat { get; set; }

  [JsonProperty("chat")]
  public GroupChat group_chat { get; set; }
....
}
Run Code Online (Sandbox Code Playgroud)

但它不能用我的WebAPI 2控制器方法,因为我Message使用FromBody属性反序列化:

public async Task<HttpResponseMessage> Post(string token, [FromBody] Update update)
Run Code Online (Sandbox Code Playgroud)

(类型Update具有字段message类型的Message)

有没有更好的方法来实现Message类型?

Vol*_*soy 3

由于您应该在一个字段中处理看似两个完全不同的对象,因此我认为您不能使用强类型对象,但您可以在聊天字段中使用动态类型,例如

public class Telegram
{
    public int message_id { get; set; }
    public dynamic chat { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以访问变量并检查它们是否为空或不了解它是用户还是群聊:

static void Main(string[] args)
{
    string json = @"{ ""chat"": { ""id"": 1, ""first_name"": ""my_first_name"", ""last_name"": ""my_last_name"",  ""username"": ""my_username"" }, ""message_id"": 123 }";
    var telegram = Newtonsoft.Json.JsonConvert.DeserializeObject<Telegram>(json);
    string name = telegram.chat.first_name; // name = my_first_name
    string title = telegram.chat.title; // title = null
}
Run Code Online (Sandbox Code Playgroud)