大家好!设有一个类Hero,现在需在多个不同的Hero实例之间传递消息,为此我的实现方式是:为Hero实现1个专门接收消息的方法OnMessage(),并定义1个专门携带消息的类Telegram。当A要向B发送消息时,把消息内容写在Telegram中,并调用B.OnMessage(Telegram)进行消息传递。
现在遇到的困难是:当可能发送的消息内容包含多种变量类型(例如,可能是int、string、List、string数组等)时,如何编写代码使得程序更简洁?
具体请看我目前的实现(代码不够简洁):
1、首先在Hero类中,增加专门接收并处理消息的方法OnMessage()
class Hero()
{
public void OnMessage(Telegram t)//t携带了具体的消息,详见下文
{
//t.index标识了应该调用哪个方法处理这条消息,例如:
switch(t.index)
{
case 1:
//方法1
case 2:
//方法2
}
}
}
2、其次,定义1个结构体Telegram,专门用来携带具体消息内容,它有2个成员变量:index(标识应调用哪个方法处理本消息)和info(携带具体消息内容)
struct Telegram
{
public int index;//用来标识应调用哪个方法处理本消息,每个index都对应着Hero类中一个具体的处理方法
//注:由于不同的方法对应的参数类型是不同的,例如,方法1的参数是int、方法2的参数是string、方法3的参数是string数组……,所以我的实现方式比较繁琐,如下
public int info_int;//当这条消息打算发给方法1进行处理时,把消息内容赋值给这个变量,其他的info变量不赋值
public string info_string;//当这条消息打算发给方法2进行处理时,把消息内容赋值给这个变量,其他的info变量不赋值
public string[] info_stringArray;//当这条消息打算发给方法3进行处理时,把消息内容赋值给这个变量,其他的info变量不赋值
}
3、因此,OnMessage()的内容实际上是这样的:
class Hero()
{
public void OnMessage(Telegram t)
{
switch(t.index)
{
case 1://调用方法1,且参数类型为int
func1(t.info_int);
break;
case 2://调用方法2,且参数类型为string
func2(t.info_string);
break;
case 3://调用方法3,且参数类型为string数组
func3(t.info_stringArray);
break;
default:
}
}
}
情况描述完毕了,主要想请教的就是:以上Telegram中几个不同的info变量,能否统一成1个变量?
//期望能做到这样的效果:
class Hero()
{
public void OnMessage(Telegram t)
{
switch(t.index)
{
case 1:
func1(t.info);//该方法的输入参数为int,而且会把t.info当做int进行处理
break;
case 2:
func2(t.info);//该方法的输入参数为string,而且会把t.info当做string进行处理
break;
case 3:
func3(t.info);//该方法的输入参数为string数组,而且会把t.info当做string数组进行处理
break;
default:
}
}
}
对了,截至目前为止我尝试的思路有以下几种,在此列出也是希望大家能帮忙指点一下(尤其是思路2和思路3是否可行),十分感谢:
1、将info定义为Object,赋值、传参时全部以Object进行操作。但存在问题是:反复的装箱、拆箱操作影响效率(程序运行时消息传递非常频繁)。因此该方案放弃了。
2、将info定义为自定义格式文本或json,传参之后再自行解析。但这块我还没有深入学习,此外担心json转换过程中是否存在类似于Object装箱拆箱影响效率的问题?
3、利用C#的泛型。但这块我学习的也不足,目前的尝试仍然失败了,如下所示
(3.1)定义1个泛型类MsgInfo
public class MsgInfo<T>
{
public T obj;
public MsgInfo(T objInput)
{
this.obj = objInput;
}
}
(3.2)在Telegram中使用它,结果出错了
struct Telegram
{
public int index;
public MsgInfo<T> info;//注:此处是会报错的,因为泛型类在实例化时必须制定变量类型,因此这里是不能写T的,只能写int、string等等
}
由于没有余额了,无法发起悬赏,非常抱歉~