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

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分,结贴有答案新帖加分,感谢指教。
...全文
246 5 打赏 收藏 转发到动态 举报
写回复
用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()
内容概要:本报告基于DNA双螺旋归因模型,通过对奇瑞集团三大主体公司(奇瑞汽车、奇瑞新能源、得壹能源)共超4.5万件专利的深度分析,揭示其“整车层→系统层→材料层”三层研发体系的结构性特征与核心矛盾。研究发现,奇瑞在工程应用层面专利布局雄厚,但在底层材料科学和化学领域严重薄弱,导致从整车工程向材料研发延伸出现“技术断层”。典型案例为得壹能源硅碳负极专利CN120463202A在9个月内被驳回,暴露出“公知工艺拼接、参数微调、缺乏创新机理”的深层次问题,反映出集团在材料领域研发投入不足、人才断层、团队割裂的战略短板。; 适合人群:企业IPR负责人、研发总监/CTO、科技领域投资人及从事新能源汽车技术战略布局的研究人员。; 使用场景及目标:①评估企业专利质量与研发战略匹配度;②识别技术布局的结构性风险;③指导高价值专利培育与底层技术创新路径规划;④为投资尽调提供技术维度的风险预警。; 阅读建议:本报告强调“专利数据即技术战略镜像”,建议结合IPC分类、发明人流动、法律状态等多维数据交叉研判,避免仅凭专利数量误判企业真实创新能力,尤其在固态电池、芯片等前沿领域需重点关注底层专利质量。

111,129

社区成员

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

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

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