合理利用PropertyInfo.SetValue()

在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,结束。但没有对该方法作过性能上的测试

4 Responses

  1. Guest April 15 2008 , 17:19
    Guest
    大哥,我想问一下怎么你的日志在Firefox和Safari下看,导航链接是英文,去到IE下看就是中文的,应该不是和编码有关的啊,我弱弱的问。
    #1
  2. 幻想曲 April 15 2008 , 17:21 cn
    幻想曲
    @Guest:
    有可能是你的firefox或safari的语言设为了英文,所以用ff或safari看时就成了英文。
    这里的一些文本是根据浏览器语言来显示的。
    #2
  3. weiming July 1 2008 , 17:47
    weiming
    有个问题问下你啊
    就是关于那个SetValue方法的
    你要是看见的话加我QQ(280803183) 或给我发邮件(weimingghy@yahoo.com.cn)
    #3
  4. wangdybyt July 3 2008 , 16:17
    wangdybyt
    dotnet 3.0 不用写访问器了吧
    #4

Write a comment:



(Will show your Gravatar icon)  



[b][/b] - [i][/i] - [u][/u]- [quote][/quote]

:-/ ^_^ :d :o :kiss: :) :p :se: [yeah] :( :love: :han: :up: :cry: :zzz: o_o

申请链接请看这里