100分问题

wenyegood 2008-11-20 04:43:37
public static IList FillDataList(object obj, System.Data.IDataReader reader, Hashtable columnTable)
{
ArrayList list = new ArrayList();
string value;
string columnName = string.Empty;
while (reader.Read())
{
foreach (PropertyInfo property in obj.GetType().GetProperties())
{
columnName = columnTable[property.Name].ToString();
value = reader[columnName].ToString();
if (value != "")
{
property.SetValue(obj, Convert.ChangeType(value, property.PropertyType), null);
}
}
list.Add(obj);
}
return list;
}
这段代码中最后list中的所有值都是一样的这个问题如何解决。。。
...全文
200 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
pojianbing 2008-11-21
  • 打赏
  • 举报
回复
不好意思,object没有clone的方法,我搞错了.
如果你上边传的object如果是自定义的类话,可以用以下方法:

public static IList FillDataList(object obj, System.Data.IDataReader reader, Hashtable columnTable)
{
ArrayList list = new ArrayList();
string value;
string columnName = string.Empty;
while (reader.Read())
{
foreach (PropertyInfo property in obj.GetType().GetProperties())
{
columnName = columnTable[property.Name].ToString();
value = reader[columnName].ToString();
if (value != "")
{
property.SetValue(obj, Convert.ChangeType(value, property.PropertyType), null);
}
}
list.Add(CloneObjectobj(obj)); //改这里
}
return list;
}

/// <summary>
/// 克隆对象
/// </summary>
/// <param name="obj">obj必须能够序列化</param>
/// <returns></returns>
private object CloneObject(object obj)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();

formatter.Serialize(ms, obj);

ms.Position = 0;
Object ClonedObject = formatter.Deserialize(ms);

ms.Close();

return ClonedObject;
}


不过CloneObject有一个限制就是要传的object是能够序列化的,即要在你定义的类上加Serializable属性.
sunrise2199 2008-11-21
  • 打赏
  • 举报
回复
up
shanying_0 2008-11-21
  • 打赏
  • 举报
回复
obj。楼主你没有弄明白引用类型的参数的函数!!
你每次改变的都是obj这个引用。也就是每次都对obj所对应的对象进行处理了
比如说你第1个obj指向的是托管堆中的地址为10的一块内存。里边的内容是1110;
你第2个obj其实仍然指向是地址为10的这快内存。也就是对1110进行修改,边成了0000。然后你又添家了一个obj
此时队列中就是list[0]为0000。list[1]为0000
嘎嘎。将的有点乱。希望楼主在自己揣摩一下。嘎嘎
MicroDeviser 2008-11-21
  • 打赏
  • 举报
回复
用泛型,实现clone 接口
palmax 2008-11-21
  • 打赏
  • 举报
回复
这个还是要调试一下了,如果value = reader[columnName].ToString()的值就是"",那么你的判断 if (value != "") 便不成立,list中添加的永远是同一个obj

不过我猜楼主那段代码的意思就是想把满足if (value != "") 的元素放到list里返回,但是代码的逻辑是不正确的。
hztltgg 2008-11-21
  • 打赏
  • 举报
回复
obj没有Clone方法的吧
grady.lu 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 hztltgg 的回复:]
objInstance和传过来的obj参数有什么关系?
[/Quote]
同一类型
pojianbing 2008-11-20
  • 打赏
  • 举报
回复

public static IList FillDataList(object obj, System.Data.IDataReader reader, Hashtable columnTable)
{
ArrayList list = new ArrayList();
string value;
string columnName = string.Empty;
while (reader.Read())
{
foreach (PropertyInfo property in obj.GetType().GetProperties())
{
columnName = columnTable[property.Name].ToString();
value = reader[columnName].ToString();
if (value != "")
{
property.SetValue(obj, Convert.ChangeType(value, property.PropertyType), null);
}
}
list.Add(obj.Clone()); //改这里
}
return list;
}

lzp765 2008-11-20
  • 打赏
  • 举报
回复
学习
长沙三毛 2008-11-20
  • 打赏
  • 举报
回复
判断value非空:string.IsNullOrEmpty(value)
good-code 2008-11-20
  • 打赏
  • 举报
回复
学习
hztltgg 2008-11-20
  • 打赏
  • 举报
回复
objInstance和传过来的obj参数有什么关系?
wihtsky 2008-11-20
  • 打赏
  • 举报
回复
帮顶
grady.lu 2008-11-20
  • 打赏
  • 举报
回复
public static IList FillDataList(object obj, System.Data.IDataReader reader, Hashtable columnTable)
{
ArrayList list = new ArrayList();
string value;
string columnName = string.Empty;
while (reader.Read())
{
foreach (PropertyInfo property in obj.GetType().GetProperties())
{
Type t = obj.GetType();
object objInstance = Activator.CreateInstance(t);
columnName = columnTable[property.Name].ToString();
value = reader[columnName].ToString();
if (value != "")
{
property.SetValue(objInstance, Convert.ChangeType(value, property.PropertyType), null);
}
}
list.Add(objInstance);
}
return list;
}
这样就可以了
hztltgg 2008-11-20
  • 打赏
  • 举报
回复
传过来的参数object obj是什么?有什么内容?object好像没有克隆函数,不能实现深拷贝,如果没有内容的话,干脆不要传过来算了,自己new几个出来
LorenLiu 2008-11-20
  • 打赏
  • 举报
回复
Mark一下

LZ的意思是想在不知道obj的类型的情况下去修改这个对象内属性的值。想想看有什么办法
wenyegood 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 luckyyeung 的回复:]
如果传入的obj是一样的话,最后的list值当然是一样呀!不知道LZ说的是什么意思
[/Quote]
这位兄弟没看懂!看这句话: property.SetValue(obj, Convert.ChangeType(value, property.PropertyType), null);
wenyegood 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 luckyyeung 的回复:]
如果传入的obj是一样的话,最后的list值当然是一样呀!不知道LZ说的是什么意思
[/Quote]
这位兄弟没看懂!看这句话: property.SetValue(obj, Convert.ChangeType(value, property.PropertyType), null);
wenyegood 2008-11-20
  • 打赏
  • 举报
回复
property.SetValue(obj, Convert.ChangeType(value, property.PropertyType), null);
这句话执行以后怎么把obj拷贝一份再加到list中呢这样就可以解决问题了
chtsir 2008-11-20
  • 打赏
  • 举报
回复
public static IList FillDataList(object obj, System.Data.IDataReader reader, Hashtable columnTable)
{
ArrayList list = new ArrayList();
string value;
string columnName = string.Empty;
while (reader.Read())
{
foreach (PropertyInfo property in obj.GetType().GetProperties())
{
columnName = columnTable[property.Name].ToString();
value = reader[columnName].ToString();
if (value != "")
{
property.SetValue(obj, Convert.ChangeType(value, property.PropertyType), null);
list.Add(obj);
}
}

}
return list;
}
加载更多回复(8)

111,131

社区成员

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

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

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