合理利用PropertyInfo.SetValue()

2008年04月15日  |  5:40 下午分类:Develop  |  

在asp.net开发中,一般都会按最基本的分层来做,这里说的最基本的分层是指实体层(model)、数据操作层、表现层。
实体层一般来说都是数据库中表字段的映射。
一个典型的常见的代码如下:

public class Product
{
public int ID
{
get;
set;
}
public string ProductName
{
get;
set;
}
public decimal Price
{
get;
set;
}
//..其它属性
}

一个操作类:

public void AddProduct(Product p)
{
//数据操作
}

UI层会有一个表单,以供填写相关内容,点击提交后,代码一般如下:

Product p = new Product();
p.Name=Request.Form["xxx"];
//....
AddProduct(p);
//.....

如果实体类有20个属性,那我们得赋20(或20以下)次值,如果更多,那就太枯燥无聊了。
试想,我们通过反射找到该类的所有属性,然后给这些属性相应进行赋值不就省心许多?
但,如何来实现?
首先,我们的表单项的name属性一定要与class的属性名完全一致,然后处理post过来的所有表单项。代码可能如下:

public static void SetObjectPropertyValue(object obj, StringDictionary nv)
{
Type type = obj.GetType();
PropertyInfo[] pi = type.GetProperties();
foreach (PropertyInfo item in pi)
{
if (nv.ContainsKey(item.Name.ToLower()))
{
item.SetValue(obj, Convert.ChangeType(nv[item.Name.ToLower()], item.PropertyType, CultureInfo.CurrentCulture), null);
}
}
}

方法SetObjectPropertyValue就实现对类的属性进行赋值的功能。
该方法是反射出obj的所有属性,然后调用PropertyInfo的SetValue方法进行赋值。参数nv是一个StringDictionary 类型的数据,是这样进行传送的:

System.Collections.Specialized.NameValueCollection nameValueCollection = Request.Form;
System.Collections.Specialized.StringDictionary sd = new System.Collections.Specialized.StringDictionary();

foreach (string key in nameValueCollection.Keys)
{
if (sd.ContainsKey(key) == false)
sd.Add(key, nameValueCollection[key]);
}
Utility.SetObjectPropertyValue(action, sd);
//数据操作

OK,结束。但没有对该方法作过性能上的测试

转载时务必以超链接形式标明文章原始出处和作者信息。

相关文章

  • 暂无相关日志

发表您的评论

1410168172122013183195114157619