c# - 如何处理一个类的不同版本?
问题描述
我目前正在构建一个测试客户端,该客户端需要通过计划 TCP 将数据作为 JSON 发送到服务器应用程序。该协议 - 除了其他元素 - 由消息对象组成。现在,已经需要对 Message 类进行两个不同的修订。它们彼此不相关并且具有完全不同的特性。
这是一个了解这个想法的例子:
协议版本 1
class Message
{
public string sender { get; set; }
public int message_id { get; set; }
public string text { get; set; }
public int priority { get; set; }
public List<string> parameters { get; set; }
public Message()
{
this.parameters = new List<string>();
}
}
协议版本 2
class Message
{
public int id { get; set; }
public int someotherid { get; set; }
public List<string> data { get; set; }
public Message()
{
this.data = new List<string>();
}
}
这些类没有任何共同点,它们不共享共同的基类型或其他东西。如果我仍然想Message
在我的代码中使用它们,我将如何组织这些不同的版本?
我想出的唯一方法是使用不同的命名空间,以便第一个版本存在MyProtocol.Rev1.Message
于MyProtocol.Rev2.Message
. 这会起作用,我可以简单地在该部分中拉入所需的命名空间using
,但它有点静态。有没有更好的办法?
解决方案
像这样的东西呢
Message message = new Message();
var messagev1 = message.GetProtocol<IMessageProtocolv1>();
var messagev2 = message.GetProtocol<IMessageProtocolv2>();
messagev1.message_id = 450077;
messagev2.id = 1000023;
要做到这一点
interface IMessage
{
}
interface IMessageProtocolv1 : IMessage
{
string sender { get; set; }
int message_id { get; set; }
string text { get; set; }
int priority { get; set; }
List<string> parameters { get; set; }
}
interface IMessageProtocolv2 : IMessage
{
int id { get; set; }
int someotherid { get; set; }
List<string> data { get; set; }
}
abstract class MessageBase : IMessageProtocolv1, IMessageProtocolv2
{
public abstract string sender { get; set; }
public abstract int message_id { get; set; }
public abstract string text { get; set; }
public abstract int priority { get; set; }
public abstract List<string> parameters { get; set; }
public abstract int id { get; set; }
public abstract int someotherid { get; set; }
public abstract List<string> data { get; set; }
}
class Message : MessageBase
{
public Message()
{
this.parameters = new List<string>();
this.data = new List<string>();
}
public override string sender { get; set; }
public override int message_id { get; set; }
public override string text { get; set; }
public override int priority { get; set; }
public override List<string> parameters { get; set; }
public override int id { get; set; }
public override int someotherid { get; set; }
public override List<string> data { get; set; }
public T GetProtocol<T>()
{
return (T)(object)this;
}
}
推荐阅读
- ansible - 未安装作曲家 - ansible
- git - 搞砸了我的 git repo,不知道如何正确同步
- java - 如何进行这些类型的字符串模式匹配
- c# - 我可以在用户之间发送数据库吗?
- javascript - HTML:防止在某些标点符号前面有空格之前换行
- python-3.x - PyQt5 ImportError:DLL 加载失败
- ruby-on-rails - 找不到 Api::UsersController 的操作“更新”:
- java - 如何在 Android 的片段中使用 onBackPress 按钮
- react-native - 在使用 Facebook 登录时不会触发 onLoginFinished 回调
- javascript - 未找到客户端,使用 Express-generator 生成的项目