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

しかし、属性Messageを使用して逆シリアル化するため、WebAPI 2 コントローラー メソッドでは機能しません。FromBody

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

( typeにはtypeUpdateのフィールドがあります)messageMessage

型を実装するより良い方法はありますMessageか?

4

3 に答える 3

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

しかし、私が実際に行うことは、これをより高いレベルで処理することです。ここのドキュメントを見ると、これらすべてを処理できる複雑なオブジェクトではなく、メッセージの送受信の観点から考えることができます。次に、メッセージを受信したときに実行する可能性のあるすべてのアクションを考えます。そこから、これらのアクションごとにイベントを発生させることができるオブジェクトを作成します。データを受け取るとき(メッセージとは考えないでください)、データを解析し、おそらく 1 つの Telegram メッセージ オブジェクトからいくつかのイベントを発生させます。これらのイベントの一部では、イベントに必要なデータのクラス定義が必要になる場合がありますが、ここではスコープがはるかに狭いものについて話しています。単一責任の原則により適しています。

逆方向 (データを受信するのではなく送信する) に進むと、オブジェクトには、データを送信するときに行う可能性のあるさまざまな種類のメソッドが含まれます。これらのメソッドの一部では、必要なデータのクラスが必要になる場合があります。可能であれば、受信イベントに使用したのと同じクラスを使用してください。Send()多くのオーバーロードを持つ1 つのメソッドにすぎない場合もあります。

于 2015-08-07T00:08:18.230 に答える
0

Javaでもこの問題に直面しました。C# と Java はどちらも強力な型付け言語であるため、私の問題は似ていました。ジェネリックChatクラスを作成することでこれを解決しました。このChatクラスには、 と のプロパティが含まれていUserますGroupChat。このクラスには、isUser()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 に答える