создать элемент данных с двумя типами

Я пытаюсь создать класс сообщений телеграммы и использовать их веб-сервисы. Сообщение телеграммы имеет имя свойства чата, которое может быть типом пользовательского или группового чата. как это:

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

как я могу создать элемент данных с двумя типами? теперь у меня есть идея, как мне задать свой вопрос. это немного ново для меня, поэтому, пожалуйста, примите мои извинения, если это так очевидно. Спасибо.

Обновить

Большое спасибо. я изменил свой класс сообщений следующим образом:

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

но проблема в том, что когда я меняю класс, телеграмма не может вызвать мой веб-сервис. Я не имею понятия почему!


person Mohammad    schedule 02.09.2015    source источник
comment
создайте класс сообщений с двумя свойствами: один для частного и один для группового разговора. если вы объясните больше, люди могут помочь вам лучше. может быть, это не единственный способ решить эту проблему.   -  person Arash    schedule 02.09.2015
comment
бул тип? не могли бы вы объяснить немного больше?   -  person Mohammad    schedule 02.09.2015
comment
Являются ли User и GroupChat производными от базового класса?   -  person BDH    schedule 02.09.2015
comment
оба имеют только один общий член.   -  person Mohammad    schedule 02.09.2015


Ответы (4)


Почему бы вам просто не создать два члена разных типов и не проверить, какой из них не равен нулю?

Вам также следует прочитать об интерфейсах.

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");
    }
}
person micnyk    schedule 02.09.2015
comment
Я не могу этого сделать. если я добавлю только одного дополнительного члена в класс сообщений, телеграмме не удастся отправить мне новое обновление (я использую веб-хук). - person Mohammad; 02.09.2015
comment
большое спасибо, дорогой @micnyk. не могли бы вы рассказать мне, как я могу использовать вашу идею в качестве входных данных для веб-сервиса? я имею в виду, что телеграмма вызывает мой веб-сервис с сообщением и ожидает пользователя или группу в качестве чата. это та часть, которую я не понимаю. - person Mohammad; 02.09.2015

Вы имеете в виду сделать настройку? Обычно это делается так:

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

public class Message
{
  public ChatType Chat;
}

Вы также можете создать интерфейс или базовый класс, которые в конечном итоге могут быть различными типами объектов чата.

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() };
  }
}
person user5293163    schedule 02.09.2015
comment
Спасибо. но это не сработает. где я должен поместить метод процессора? - person Mohammad; 02.09.2015
comment
Процессор как в MessageProcessor. Это просто заглушка для вставки кода. Посмотрите, как назначаются свойства, и используйте это в своем собственном коде. - person user5293163; 02.09.2015

Пусть и User, и GroupChat реализуют интерфейс. Что-то вроде IConversationOwner. Тогда ваш тип члена может быть просто IConversationOwner.

person theB    schedule 02.09.2015

Используйте Object as Type и проверьте с помощью if(obj is User).. / if(obj is GroupChat)

person Rem Brandt    schedule 02.09.2015