111,097
社区成员




//基类
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" }});
}
}
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进去 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;