我有两个用户定义类型的列表
例如List<User_Master>
和List<User_Master_Temp
&gt; User_Master
和User_Master_Temp
都包含相同名称的相同类型的变量。
我该如何分配这些类型的清单?
传统的做法是
userMaster.UserName = userMasterTemp.UserName;
userMaster.UserEmail = userMasterTemp.UserEmail;
userMaster.UserSalary = userMasterTemp.UserSalary;
为什么我需要这个?
我正在使用EF 5(数据库第一种方法)和MVC 4,我在模型中应用我的数据注释验证,如果我更新我的edmx文件然后运行自定义工具,我的所有验证都会消失。
所以我编写了自己的View Model Class,它与Original Model Class相同,我在View Model Class中应用了我的数据注释。
答案 0 :(得分:2)
考虑使用Automapper使用已定义的配置或某些约定将一个自定义实例转换为另一个自定义实例。它有一个映射属性的约定,如果它们具有相同的名称和类型是兼容的,默认情况下它们有效。下一代码演示了它的用法
void Main()
{
List<UserMaster> users = new List<UserMaster>{
new UserMaster{Name = "Bob", Email = "bob@mail.ru", Salary = 10},
new UserMaster{Name = "Jack", Email = "jack@mail.ru", Salary = 20},
new UserMaster{Name = "John", Email = "john@mail.ru", Salary = 40},
};
Mapper.CreateMap<UserMaster, UserMasterTemp>();
List<UserMasterTemp> usersTemp = Mapper.Map<IEnumerable<UserMaster>,
List<UserMasterTemp>>(users);
usersTemp.ForEach(Console.WriteLine);
}
class UserMaster
{
public string Name { get; set; }
public string Email { get; set; }
public decimal Salary { get; set; }
}
class UserMasterTemp
{
public string Name { get; set; }
public string Email { get; set; }
public decimal Salary { get; set; }
//formating for demo purposes
public override string ToString()
{
return string.Format("Name: {0}, Email: {1}, Salary: {2}",
Name, Email, Salary);
}
}
打印:
Name: Bob, Email: bob@mail.ru, Salary: 10
Name: Jack, Email: jack@mail.ru, Salary: 20
Name: John, Email: john@mail.ru, Salary: 40
答案 1 :(得分:1)
User_Master.Select(m=>new User_Master_Temp(){/*assign the Properties*/});
如果您使用某个对象来对象映射器,则可以使用{i} Glue来执行此操作。
var Mapping = new Mapping<User_Master, User_Master_Temp>();
Mapping.AutoRelateEqualNames();
User_Master.Select(m=>Mapping.Map(m));
答案 2 :(得分:1)
答案 3 :(得分:1)
或者如果您不想使用工具,可以使用此方法:
public static void CopyIdenticalObjects(object source, object destination)
{
FieldInfo[] destinationFields = destination.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
foreach (FieldInfo sourceField in source.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public))
for (int counter = 0; counter < destinationFields.Length; ++counter)
try
{
if (destinationFields[counter].Name.Equals(sourceField.Name))
{
destinationFields[counter].SetValue(destination, sourceField.GetValue(source));
break;
}
}
catch { }
}