日期:2014-05-18  浏览次数:20388 次

A 对象复制成 B对象的反射问题
举个例来说明这个问题,我现在从数据库读取一个表User后得到实体对象PUser,里面包含了2个属性:Username,password,而我又有一个对象VUser,跟PUser结构类似,只是没有属性password,我现在需要把PUser复制到VUser,因为他们都有Username,因此username会复制,但password不会。

在java里面,这实际就是一个PO,VO转换的问题,在.NET怎么解决呢?
1.用序列化/反序列化来完成复制,(我没搞懂);
2.用ICloneable接口来实现,我也不知道怎么做;
3.轮询VUser,存在的属性就复制,不存在就放弃;

我现在的问题是已知对象的Type,怎么得到他的对象呢?

------解决方案--------------------
让PUser继承VUser...
------解决方案--------------------
强制类型转换
------解决方案--------------------
up
------解决方案--------------------
static void copyUsername(PUser a,VUser b)
{
b.username = a.username;
.......
}

这个东西一般来说尽可能不要使用反射。


------解决方案--------------------

------解决方案--------------------
.net的反射(遍历类型的PropertyInfo,PropertyInfo.SetValue/GetValue读写对象的属性值)基本上跟java的PropertyUtils是完全一样的。

http://www.google.cn/search?complete=1&hl=zh-CN&newwindow=1&rls=com.microsoft%3Aen-US&q=.net+propertyinfo+setvalue&meta=
------解决方案--------------------
之所以这样就是为了隔离数据层和表现层对象;
-----------------
如果只是为了这个...VUser继承PUser...将VUser sealed...PUser.Password声明为protected...
------解决方案--------------------
1。
那就自定义一个方法,硬编码一个个拷贝对应属性了,代码量多?

没办法,你又不想用反射(牺牲性能,运行时效率),又想提高开发效率?有这等没事

2。
我之前回复过,实现 ICloneable ,现在看你的情况,不适合,Clone, Clone,也就说是克隆同类,而你这里是两个类

序列化与反序列化,也不适合,理由同clone

3。
1.让PUser继承VUser...
之所以这样就是为了隔离数据层和表现层对象;
===========

我想,如果反过来, VUser 继承 PUser,应该是合理的,而且也可以解决问题,

数据层?PO 应该是在数据实体层的吧?那么 UI 依赖它完全可以啊,也是合理的

VUser 中重写 Password 属性

public string Password {
get { thrown new NotSupportedException( "无法读取此属性 "); }
}
------解决方案--------------------
让PUser继承VUser
------解决方案--------------------
帮顶了
------解决方案--------------------
帮顶了
------解决方案--------------------
顶了