。net没宏很麻烦请教代替的办法。

csdn网速很慢 2014-05-03 06:07:30
有段类似这样的程序 每个类a,b,c 都要执行regist 和添加到枚举 还有都差不多的处理函数。 这样写起来很麻烦啊。如果有宏的话每个类 几行就搞定了。 C#有什么办法实现类似宏的效果让代码简洁些。
class classPreSet
{
regist(T a)
{
}
}
enum aa
{
a, b, c
}

class a
{
}
class b
{}
class c
{
}
...全文
272 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
PaulyJiang 2014-05-05
  • 打赏
  • 举报
回复
来晚了没蹭到分啊
csdn网速很慢 2014-05-05
  • 打赏
  • 举报
回复
引用 14 楼 gounliey 的回复:
[quote=引用 13 楼 jiergio 的回复:] [quote=引用 9 楼 caozhy 的回复:] MSGType这个参数本身就不需要。 直接传Type类型。然后反射创建实例。
你是说知道一个类的 Type 信息 可以实例化这个类吗? 该怎么写呢[/quote]

            Type stringType = typeof(string);
            string str = Activator.CreateInstance(stringType, '-', 16) as string;
            //same as
            //string string = new string('-', 16);
[/quote] 这个好用 记下了。 Activator 还这个方法。CreateInstance(String, String) 这个不知道执行效率如何。看它的描述是要查找的有没有超过log(1)的复杂度。 看见查找感觉速度堪忧啊。
佛火 2014-05-05
  • 打赏
  • 举报
回复
引用 13 楼 jiergio 的回复:
[quote=引用 9 楼 caozhy 的回复:] MSGType这个参数本身就不需要。 直接传Type类型。然后反射创建实例。
你是说知道一个类的 Type 信息 可以实例化这个类吗? 该怎么写呢[/quote]

            Type stringType = typeof(string);
            string str = Activator.CreateInstance(stringType, '-', 16) as string;
            //same as
            //string string = new string('-', 16);
csdn网速很慢 2014-05-05
  • 打赏
  • 举报
回复
引用 9 楼 caozhy 的回复:
MSGType这个参数本身就不需要。 直接传Type类型。然后反射创建实例。
你是说知道一个类的 Type 信息 可以实例化这个类吗? 该怎么写呢
csdn网速很慢 2014-05-05
  • 打赏
  • 举报
回复
引用 9 楼 caozhy 的回复:
MSGType这个参数本身就不需要。 直接传Type类型。然后反射创建实例。
这个是网络上获取的类型id 。 要从这个MSGType来知道实例化那个类的。 所以必须要啊。 反射这个待我在研究下。 我只知道我这个方法是id 和类型的 1对1 映射。 看起来跟反射有点像。
l13873666736 2014-05-03
  • 打赏
  • 举报
回复
貌似用反射能写得比较优雅
threenewbee 2014-05-03
  • 打赏
  • 举报
回复
MSGType这个参数本身就不需要。 直接传Type类型。然后反射创建实例。
csdn网速很慢 2014-05-03
  • 打赏
  • 举报
回复
引用 7 楼 moonwrite 的回复:
可以试试泛型 (也就是c++ 中的模版) 还是事件和委托 反正我是不喜欢宏
你看这个能用泛型简化吗


  public static void registmsginfo(int poolsize = 2, MSGType registid = MSGType.none)
        {
            if (registid == MSGType.none)
            {
                for (int i = 0; i < msgtypespool.Length; i++)
                {
                    msgtypespool[i] = new Queue<MSGBase>();
                }
            }
            for (int i = 0; i < poolsize; i++)
            {
                if (registid == MSGType.MSGSample || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGSample].Enqueue(new MSGSample());  //...
                }
                if (registid == MSGType.MSGVersion || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGVersion].Enqueue(new MSGVersion());
                }
                if (registid == MSGType.MSGLogin || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGLogin].Enqueue(new MSGLogin());
                }
                if (registid == MSGType.MSGPlayerInfo || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGPlayerInfo].Enqueue(new MSGPlayerInfo());
                }

                if (registid == MSGType.MSGStart || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGStart].Enqueue(new MSGStart());
                }
                if (registid == MSGType.MSGCreateRoom || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGCreateRoom].Enqueue(new MSGCreateRoom());
                }
                if (registid == MSGType.MSGDestroyRoom || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGDestroyRoom].Enqueue(new MSGDestroyRoom());
                }
                if (registid == MSGType.MSGGetScore || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGGetScore].Enqueue(new MSGGetScore());
                }
                if (registid == MSGType.MSGScore || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGScore].Enqueue(new MSGScore());
                }
                if (registid == MSGType.MSGPlayerLost || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGPlayerLost].Enqueue(new MSGPlayerLost());
                }
                if (registid == MSGType.MSGTarget || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGTarget].Enqueue(new MSGTarget());
                }
                if (registid == MSGType.MSGSkill || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGSkill].Enqueue(new MSGSkill());
                }
                if (registid == MSGType.MSGDead || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGDead].Enqueue(new MSGDead());
                }
                if (registid == MSGType.MSGReLife || registid == MSGType.none)
                {
                    msgtypespool[(int)MSGType.MSGReLife].Enqueue(new MSGReLife());
                }
            }
        }
moonwrite 2014-05-03
  • 打赏
  • 举报
回复
可以试试泛型 (也就是c++ 中的模版) 还是事件和委托 反正我是不喜欢宏
csdn网速很慢 2014-05-03
  • 打赏
  • 举报
回复
意思
引用 2 楼 sp1234 的回复:
OOP是用来设计的,不是仅仅用来玩儿代码的。OOP把分类、继承、多态做为基本的三大特性,怎么可能没有方法和属性的抽象功能?
意思就是预定义很多格式的类 这些类并不是要在运行时给怎么样。 而是要提前定义各自的id各自的初始化 序列化 反序列话。 这几个步骤有规律类似的。 所以想要把这些类似的给代换成统一的。 比如说分配id 这个得再类初始化中或之前把。还得知道其他类的id才能判断出这个类的id,而运行中初始化时是没法获取其他类的。
csdn网速很慢 2014-05-03
  • 打赏
  • 举报
回复
这个不是玩代码的。 是项目中网络协议部分的代码。 协议嘛当然是预定义了。
csdn网速很慢 2014-05-03
  • 打赏
  • 举报
回复
啊 。 抽象我知道啊。 但是抽象是在运行时动态转化类型的。 这个是要在运行前处理啊。
  • 打赏
  • 举报
回复
如果你只是随便玩儿代码的,根本不关心程序设计,那么你应该选择各种简单的脚本语言,而不是大规模系统常用的程序设计语言。
  • 打赏
  • 举报
回复
OOP是用来设计的,不是仅仅用来玩儿代码的。OOP把分类、继承、多态做为基本的三大特性,怎么可能没有方法和属性的抽象功能?
csdn网速很慢 2014-05-03
  • 打赏
  • 举报
回复
classPreSet 这个类就是个对象池 把类手动添加到对象池太麻烦了。

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧