如何动态获取某个对象公开的属性和类型,类似delphi中的rtti机制?

txinfo 2006-10-23 05:00:50
原来是用delphi写的代码,现在需要移至C#上,咱是新手刚上路
delphi中如果published了某个属性,可以通过PropType(Obj, strPropName)函数来得到属性的类型,GetStrProp函数来得到某个属性值,不知在c#中应该如何处理,有相关代码最好

原始需求:
需要将xml文件中对应节点的值直接转换到某个对象的相应属性中,考虑到扩展性,需要做成动态的
如xml文件格式
<Data><usrid><usrid>1<usrno>test</usrno></Data>
某个业务类声明
TUsr
public int usrid;
public string usrno;
...

假设这么调用
TUsr oUsr = new TUsr();
oUsr.loadfromxml(); //在这里跟据nodename, nodevalue可以获取xml中的值动态,
//调用后ousr.usrid= 1 ousr.usrno="test"

不知在C#里类似的处理应该如何实现,先谢了
...全文
317 7 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
txinfo 2006-10-23
  • 打赏
  • 举报
回复
谢谢大家的热心支持, ^_^

我觉得反射技术还是挺适合在这里用的,序列化,反序列化我可能有机会再慢慢研究吧, 毕竟解决问题是首要的.

反射技术的文章,这里有一篇写得不错:
http://www.cnblogs.com/fineboy/archive/2005/09/02/228684.aspx
shalen520 2006-10-23
  • 打赏
  • 举报
回复
用序列化,反序列化,完全可以自定义Serializer,来处理你提到的usrno属性为空节点的问题
txinfo 2006-10-23
  • 打赏
  • 举报
回复
to Knight94(愚翁):
首先谢谢您的热心回复,刚才我查了一下MSDN,大概了解serialize 和 Deserialize的用法,感觉这也是一种解决方法,但用这种方式,还是无法达到我所说的"动态指定"的效果.
因为serialize 和Deserialize,应该就是按顺序把属性值存储起来(按我的理解),如果增加或者删除了某个属性,那么原有的.dat文件应该无法读取出来,而且我用editplus打开了存储的.dat文件,格式上和xml文件还是相差比较大.考虑用xml格式处理,就是为了尽可能地灵活,方便扩展和修改,如虽然类里面声明了两个属性,但传回来的xml格式也可能只包含了其中一个属性值
<Data><usrid>1</usrid></Data>
这时就意味着usrno属性为空字符串(有时为了减少传输大小,需要这么处理)
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
.net和java叫Reflection技术
aafshzj 2006-10-23
  • 打赏
  • 举报
回复
Type.GetProperty();

Type.GetField();
我不懂电脑 2006-10-23
  • 打赏
  • 举报
回复
用反射技术应该可以获得。
Knight94 2006-10-23
  • 打赏
  • 举报
回复
to 不知在C#里类似的处理应该如何实现,先谢了

对你所说的,好像是序列化和反序列化
[Serializable]
public class userinfo
{
public int userid;
public string userno;
}

//Save it into xml file
userinfo myData = new userinfo();
BinaryFormatter Bf = new BinaryFormatter();
FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
Bf.Serialize( fs,myData);

//Read it from xml file
FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
BinaryFormatter Bf = new BinaryFormatter();
userinfo myData = Bf.Deserialize( fs ) as userinfo;
if( myData != null )
{
//Access its data here
}
相关推荐
发帖
C#

10.9w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-23 05:00
社区公告

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