snisn 2020-01-31 18:23 采纳率: 100%
浏览 773

C#中如何构造一个兼容多种参数类型的类用以传递不同类型的消息?

大家好!设有一个类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等等
}

由于没有余额了,无法发起悬赏,非常抱歉~

  • 写回答

1条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2020-01-31 19:17
    关注

    object 了解下aa

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog