使用两种类型创建数据成员

create datamember with two types

我正在尝试创建电报消息 class 并使用他们的 Web 服务。 telegram 消息有一个 属性 名称 chat,可以是用户或群聊的类型。像这样:

chat    User or GroupChat   Conversation the message belongs to — user in case of a private message, GroupChat in case of a group

如何创建具有两种类型的数据成员?我现在知道我应该怎么问我的问题了。这对我来说没什么新意,所以如果它如此明显,请接受我的道歉。 谢谢。

更新

非常感谢。我把我的消息 class 改成了这样:

namespace bot.TelegramUpdate
{
    [DataContract]
    public class Message
    {
        [DataMember(Order = 1)]
        public int message_id;
        [DataMember(Order = 2)]
        public User from;
        [DataMember(Order = 3)]
        public int date;
        [DataMember(Order = 4)]
        public IChat chat;
    }
}

还有我的 Ichat 界面:

interface IChat
{
    int Id { get; set; }
}

class User : IChat
{
    [DataMember(Order = 1)]
    public int id { get; set; }
    [DataMember(Order = 2)]
    public string first_name;
    [DataMember(Order = 3)]
    public string last_name;
    [DataMember(Order = 4)]
    public string username;
}

class GroupChat : IChat
{
    [DataMember(Order = 1)]
    public int id { get; set; }
    [DataMember(Order = 2)]
    public string title;
}

但问题是当我更改 class 时,电报无法调用我的网络服务。我不知道为什么!

为什么不创建两个不同类型的成员并检查哪个不为空?

您还应该阅读有关 interfaces 的内容。

using System;

public class Test
{
    interface IChat
    {
        int Id { get; set; }
    }

    class User : IChat
    {
        public int Id { get; set; }
        public string first_name;
        public string last_name;
        public string username;
    }

    class GroupChat : IChat
    {
        public int Id { get; set; }
        public string title;
    }

    class MyClass
    {
        public IChat Chat { get; set; }
    }

    public static void Main()
    {
        MyClass foo = new MyClass();
        foo.Chat = new User();

        MyClass bar = new MyClass();
        bar.Chat = new GroupChat();

        if(foo.Chat.GetType() == typeof(User))
            Console.WriteLine("foo has User");
        else
            Console.WriteLine("foo has GroupChat");

        if(bar.Chat.GetType() == typeof(User))
            Console.WriteLine("bar has User");
        else
            Console.WriteLine("bar has GroupChat");
    }
}

使用对象作为类型并检查 if(obj is User).. / if(obj is GroupChat)

让 User 和 GroupChat 都实现一个接口。类似于 IConversationOwner。那么你的会员类型就可以是 IConversationOwner.

您是说要进行设置吗?这通常是这样完成的:

public enum ChatType { User = 1, GroupChat = 2 }

public class Message
{
  public ChatType Chat;
}

您还可以创建一个界面或基础 class,最终可以成为不同类型的聊天对象。

public interface Chat
{
  // chat properties
}

public User : Chat
{
}

public GroupChat: Chat
{
}

public Processor
{
  public void Receive(Message mesage)
  {
     var user = message.Chat as User;
     if(user != null)
     // Handle user specific
  }

  public Message Send()
  {
     if(single)
       return new Message() { Chat = new User() };
     else
       return new Message() { Chat = new ChatGroup() };
  }
}