使用两种类型创建数据成员
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() };
}
}
我正在尝试创建电报消息 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() };
}
}