如何自动赋值?

xuandme000 2007-04-24 05:36:14
public void Hash2Object(Hashtable hash, object entityObject)
{
Type ty = entityObject.GetType();
BindingFlags.SetProperty, null, entityObject, values);

System.Reflection.PropertyInfo[] pis = ty.GetProperties();
string propertyName;

foreach (System.Reflection.PropertyInfo pi in pis)
{
propertyName = pi.Name;
object[] values = GetValueFromHashtable(hash, propertyName,pi.PropertyType);
if (values != null && values.Length > 0)
{
ty.InvokeMember(propertyName, BindingFlags.SetProperty, null, entityObject, values);

}
}
}
private static object[] GetValueFromHashtable(Hashtable hash, string key,Type type)
{
object value= hash[key] ;
return new object[] {value};

}
上面的代码是我根据网上的资料改的,意思是这样的:
首先Hashtable 的值是遍历页面控件获取的,为string类型,key为控件的ID,现在就是要遍历实体的属性,如果发现在hashtable中有指,则对该属性进行赋值.现在的问题就是,如果实体类的属性为string类型就不会有问题,可是如果是int类型或guid类型等其他类型就会出错.请各位帮忙,看看有什么办法可以解决这个问题.
谢谢
...全文
193 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuandme000 2007-04-25
  • 打赏
  • 举报
回复
多谢
viena(维也纳N02)
viena 2007-04-24
  • 打赏
  • 举报
回复
private static string GetValueFromHashtable(Hashtable hash, string key)
{
return hash[key].ToString();
}
viena 2007-04-24
  • 打赏
  • 举报
回复
这段只有我自己用到的类型,如果你的属性有其他类型,另加
viena 2007-04-24
  • 打赏
  • 举报
回复
sorry,有错误,改正

propertyName = pi.Name;
string value = GetValueFromHashtable(hash, propertyName);
if (value != null && value != "")
{
switch(Type.GetTypeCode(pi.PropertyType))
{
case TypeCode.DateTime:
pi.SetValue(entityObject,Convert.ToDateTime(value),null);
break;
case TypeCode.Byte:
pi.SetValue(entityObject,Convert.ToByte(value),null);
break;
case TypeCode.Int16:
pi.SetValue(entityObject,Convert.ToInt16(value),null);
break;
case TypeCode.Int32:
pi.SetValue(entityObject,Convert.ToInt32(value),null);
break;
case TypeCode.Int64:
pi.SetValue(entityObject,Convert.ToInt64(value),null);
break;
case TypeCode.Single:
pi.SetValue(entityObject,Convert.ToSingle(value),null);
break;
case TypeCode.Double:
pi.SetValue(entityObject,Convert.ToDouble(value),null);
break;
case TypeCode.String:
pi.SetValue(entityObject,value,null);
break;
default:
pi.SetValue(entityObject,(object)value,null);
break;
}

}
viena 2007-04-24
  • 打赏
  • 举报
回复
然后foreach循环中的代码改为

propertyName = pi.Name;
string value = GetValueFromHashtable(hash, propertyName);
if (value != null && value != "")
{
switch(Type.GetTypeCode(pi.PropertyType))
{
case TypeCode.DateTime:
pi.SetValue(entityObject,Convert.ToDateTime(str),null);
break;
case TypeCode.Byte:
pi.SetValue(entityObject,Convert.ToByte(str),null);
break;
case TypeCode.Int16:
pi.SetValue(entityObject,Convert.ToInt16(str),null);
break;
case TypeCode.Int32:
pi.SetValue(entityObject,Convert.ToInt32(str),null);
break;
case TypeCode.Int64:
pi.SetValue(entityObject,Convert.ToInt64(str),null);
break;
case TypeCode.Single:
pi.SetValue(entityObject,Convert.ToSingle(str),null);
break;
case TypeCode.Double:
pi.SetValue(entityObject,Convert.ToDouble(str),null);
break;
case TypeCode.String:
pi.SetValue(entityObject,str,null);
break;
default:
pi.SetValue(entityObject,(entityObjectect)str,null);
break;
}

}
viena 2007-04-24
  • 打赏
  • 举报
回复
private static string GetValueFromHashtable(Hashtable hash, string key)
{
return hash[key];
}
viena 2007-04-24
  • 打赏
  • 举报
回复
Hashtable中不是string类型吗,为什么返回object[]
莫名其妙!
xuandme000 2007-04-24
  • 打赏
  • 举报
回复

难道就没有好的办法?
ustbwuyi 2007-04-24
  • 打赏
  • 举报
回复
用object或者泛型?
没觉得这样做有什么好处,带来的方便更容易被随之而来的效率问题所抵消,如果你是一个通用的object类型,那么其中转换过程中出现的效率问题和安全问题会让你得不偿失,如果用泛型的话又似乎加剧了这个麻烦
littlekeen 2007-04-24
  • 打赏
  • 举报
回复
不知道有没有一个通用的方法,就是类似 Convert.ToBoolean的方法进行类型转换
-------------------------------------------------------------------
可以自己重载一下。
xuandme000 2007-04-24
  • 打赏
  • 举报
回复
不知道有没有一个通用的方法,就是类似 Convert.ToBoolean的方法进行类型转换

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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