关于派生类被动态创建时,在基类中修改派生类属性的疑问

kafly 2014-03-21 12:04:27

//基类
public class Message
{
public void decode(ByteArray data, Message msg)
{
string[][] attrs = msg.getAttributes();
string[] attr;
ByteArray tmpbarr;
int i = 0;
while (i < attrs.Length)
{
attr = attrs[i];
byte type = data.ReadUnsignedByte();
switch (type)
{
//此处是多种数据类型的解析处理,依据派生类中指定的数据结构 省略了其它没有问题的类型
case 13: //此分支为 自定义类型数组形式数据 的解析 解析完成给派生类属性SetValue时出错
//类型“Client.com.Message[]”的对象无法转换为类型“Client.proto.p_item[]”。
uint arrlen = data.ReadUnsignedInt();
Message[] arrMsg = new Message[arrlen];
int index = 0;
while (index < arrlen)
{
data.ReadUnsignedByte();
data.ReadUnsignedByte();
data.ReadUnsignedByte();
string classname = (("Client.proto.") + data.ReadUTF());
Type classtype = Type.GetType(classname);
var obj = Activator.CreateInstance(classtype);
decode(data, (Message)obj);
arrMsg[index] = (Message)obj;
index;
}
msg.GetType().GetField(attr[0]).SetValue(msg, (Message[])arrMsg); //出错行
break;
}
}
public virtual string[][] getAttributes()
{
return null;
}
}



//派生类
public class p_role_data : Message, IMessage
{
// 此类3个属性,1,2能正确解析赋值,只有自定义数组类型的数据由于无法强制转换到派生类出错
public long role_id = 0;
public p_role_base rolebase = null;
public p_item[] items= null;

public void decode(ByteArray data)
{
base.decode(data, this);
}
override public string[][] getAttributes()
{
return (new string[][] { new string[] { "role_id", "long", "null" }, new string[] { "rolebase", "p_role_base", "null" }, new string[] { "items", "array", "p_item" }});
}
}


p_item也是Message的派生类
请教,在不改变现有处理方式的情况下,如何处理?

帖子只允许给100分,结贴有答案新帖加分,感谢指教。
...全文
180 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kafly 2014-03-21
  • 打赏
  • 举报
回复
与之类似的第二条属性的处理是下面贴出的代码,可以正常赋值
                    case 12:
                        string cn12= (("Client.proto.") + data.ReadUTF());
                        Type type12 = Type.GetType(cn12);
                        var temp = Activator.CreateInstance(type12);
                        decode(data, (Message)temp);
                        msg.GetType().GetField(attr[0]).SetValue(msg, (Message)temp);
不是数组就能用基类的类名SetValue进去
kafly 2014-03-21
  • 打赏
  • 举报
回复
恩,创建数组实例,搞定
                    case 13:
                        uint arrlen = data.ReadUnsignedInt();
                        //Message[] arrMsg = new Message[arrlen];
			Array arrMsg = Array.CreateInstance(Type.GetType("Client.proto." + attr[2]) , len_108);
                        int index = 0;
                        while (index < arrlen)
                        {
				data.ReadUnsignedByte();
				data.ReadUnsignedByte();
				data.ReadUnsignedByte();
				string classname = (("Client.proto.") + data.ReadUTF());
				Type classtype = Type.GetType(classname);
				var obj = Activator.CreateInstance(classtype);
				decode(data, (Message)obj);
				//arrMsg[index] = (Message)obj;
				arrMsg.SetValue(obj, index);
				index;
                        }
                        msg.GetType().GetField(attr[0]).SetValue(msg, arrMsg);    //过关
                        break;
kafly 2014-03-21
  • 打赏
  • 举报
回复
Activator.CreateInstance 能不能创建数组实例呢
kafly 2014-03-21
  • 打赏
  • 举报
回复
引用 2 楼 bdmh 的回复:
数组不能这么转换,你的错误是(Message[])arrMsg出错,你写个方法替换它,比如 arrMsg.OfType<p_item的类型>().Select(x => (Message)x).ToArray()
可是我这里并就只有p_item的数组,其它派生的还有很多种,没办法写强类型下去呀。
bdmh 2014-03-21
  • 打赏
  • 举报
回复
数组不能这么转换,你的错误是(Message[])arrMsg出错,你写个方法替换它,比如

arrMsg.OfType<p_item的类型>().Select(x => (Message)x).ToArray()

111,097

社区成员

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

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

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