一个自动生成模型的辅助类,可以从Request.Form或者Request.QueryString中自动生成Model

public class Person<T>
    {
        public string name;
        public bool sex;
        public int age;
        public DateTime birthday;
        public DateTime? now;
        public T desc;
    }

//main方法下面的

            var NVC = new NameValueCollection();
            NVC.Add("name", "白菜");
            NVC.Add("sex", "1");
            NVC.Add("age", "23");
            NVC.Add("birthday", "1989-06-27");
            NVC.Add("now", "2011-12-08");
            NVC.Add("Desc", ".net程序员");
            var person = NVC.ModelGeneration<Person<string>>();

 以下为扩展方法

public static class ModelGenerationExtension
    {
        /// <summary>
        /// 从名值对参数中自动填充模型
        /// </summary>
        public static T ModelGeneration<T>(this NameValueCollection nvc)
        {
            var type = typeof(T);
            var obj = (T)Activator.CreateInstance(type);
            var bindflag = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.GetField;
            var fileds = type.GetFields(bindflag);
            foreach (var filed in fileds)
            {
                var val = nvc[filed.Name];
                var fType = filed.FieldType;
                if (fType.IsGenericType && fType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    //泛型参数 可空类型
                    fType = fType.GetGenericArguments()[0];
                }
                try
                {
                    if (typeof(bool) == fType && val.ToLower() != "true" && val.ToLower() != "false")
                        if (val == "1")
                            val = "true";
                        else
                            val = "false";
                    type.GetField(filed.Name, bindflag).SetValue(obj, Convert.ChangeType(val, fType));
                }
                catch
                {
                    type.GetField(filed.Name, bindflag).SetValue(obj, Activator.CreateInstance(fType));
                }

            }
            return obj;
        }
    }

 

当然可以像这样应用:

var model= Request.Form.ModelGeneration<你的类型>();

posted @ 2011-12-09 17:51  白菜89  阅读(344)  评论(0编辑  收藏  举报