6

我正在用 C# 开发 Telegram 机器人,但难以实现Message类型。根据API 文档chat字段可以是 typeUser或 type GroupChat。我如何在 C# 中实现它?

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

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

  [JsonProperty("chat")]
  public GroupChat group_chat { get; set; }
....
}

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

public async Task<HttpResponseMessage> Post(string token, [FromBody] Update update)

(类型Update有一个message类型的字段Message

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

4

3 回答 3

2

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

public class Telegram
{
    public int message_id { get; set; }
    public dynamic chat { get; set; }
}

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

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
}
于 2015-08-05T19:01:30.247 回答
1

您可以将您的Message类型构建为接口 ( IMessage),然后使用GroupMessageUserMessage类实现它。

interface IMessage
{
   int id;

   //...

   object chat {get;}
}

public class GroupMessage : IMessage
{
   public int id;
   public GroupChat group;
   public object chat {get {return group;} }
}

public class UserMessage : IMessage
{
   public int id;
   public User user;
   public object chat {get {return user;} }
}

但我真正要做的是在更高的层次上处理这个问题。查看此处的文档,而不是可以处理所有这些的复杂对象,我会考虑发送接收消息。然后我会想到你在收到消息时可能想做的所有动作。从那里我会有一个可以为每个动作引发事件的对象。当您收到数据时(不要将其视为消息),您解析数据并可能从一个 Telegram 消息对象中引发多个事件。其中一些事件可能需要对事件所需的数据进行类定义,但现在我们谈论的范围要窄得多;更适合单一职责原则。

往另一个方向发展(发送数据而不是接收),该对象将具有用于您在发送数据时可能会做的不同类型的事情的方法。其中一些方法可能需要所需数据的类。如果可能,请使用与接收事件相同的类。它甚至可能只是一种Send()具有许多重载的方法。

于 2015-08-07T00:08:18.230 回答
0

我在Java中也遇到过这个问题。由于 C# 和 Java 都是强类型语言,我的问题是相似的。我通过创建一个泛型Chat类解决了这个问题。此类包含 from和 fromChat的属性。该类还具有方法、和。UserGroupChatisUser()isGroupChat()asUser()asGroupChat()

我不得不承认我对 C# 一无所知,所以我无法为您编写该语言的示例,但这里是ChatJava 类的主体:

@SerializedName("id")
private int id;

@SerializedName("first_name")
private String firstName;

@SerializedName("last_name")
private String lastName;

@SerializedName("username")
private String username;

@SerializedName("title")
private String title;

public boolean isUser() {
    return title == null;
}

public boolean isGroupChat() {
    return !isUser();
}

public User asUser() {
    return new User(id, firstName, username, lastName);
}

public GroupChat asGroupChat() {
    return new GroupChat(id, title);
}

它非常冗长并且添加了重复的代码,所以如果有人有任何添加,我也想听听。

于 2015-08-06T23:59:23.460 回答