我们知道在asp.net mvc中 视图可以绑定一个实体模型
然后我们三层架构中也有一个model模型
但是这两个很多时候却是不一样的对象来的
就拿微软的官方mvc例子来说明
微软的视图实体中 有loginmodel 有registermodel 等等 这些视图模型 都只是占用户实体的某几个字段而已,甚至有一些视图模型 的字段是来自多个表的,那么很多人可能用最原始的赋值方法,比如用户注册后 拿到post过来后的实体,这个时候再重新new一个三层的model实体,然后在一个个的字段赋值过来,
比如:
[httppost]
public ActionResult Register(LoginModel model)
{
UserModel userModel = new UserModel();
userModel.Name = model.Name;
userModel.Email = model.Email;
userModel.Password = model.Password;
......................................
UserDao.Add(userModel);
}
这样非常累赘,简直就是体力活。
下面我总结了两个方法,这两个方法可以自动地根据实体的属性名称自动的赋值过来,第一个是将某个实体的属性值之间赋值到一个新的实体中,如果新的实体中含有自己的属性,那么就用初始值,第二个是将一个A的实体赋值到B中
那么这个时候 我们可以用下面两个方法来转换 自动赋值两个对象的
protected T AssembleInfo<T, T2>(T2 model)
{
PropertyInfo[] propertyInfoList = GetPropertyInfoArray(typeof(T));
PropertyInfo[] propertyInfoList2 = GetPropertyInfoArray(typeof(T2));
object obj = Activator.CreateInstance(typeof(T), null);//创建指定类型实例
for (int i = 0; i < propertyInfoList.Length; i++)
{
for (int J = 0; J < propertyInfoList2.Length; J++)
{
if (propertyInfoList2[J].Name.ToLower() == propertyInfoList[i].Name.ToLower())
{
propertyInfoList[i].SetValue(obj, propertyInfoList2[J].GetValue(model,null), null);//给对象赋值
}
}
}
return (T)obj;
}
/// <summary>
/// 反射获取类的属性
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
protected PropertyInfo[] GetPropertyInfoArray(Type type)
{
PropertyInfo[] props = null;
try
{
object obj = Activator.CreateInstance(type);
props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
}
catch (Exception ex)
{
}
return props;
}
---------------------使用的时候 只需要
ModelInfo info = AssembleInfo<ModelInfo, ModelModel>(model);
就可以自动根据属性名称自动将modelmodel这个实体的值自动赋值到modelinfo
感谢你的阅读,希望对你有帮助 谢谢