C# 我如何做列表<;用户定义类型>;=列表<;用户定义的类型2>;?

C# 我如何做列表<;用户定义类型>;=列表<;用户定义的类型2>;?,c#,entity-framework,list,C#,Entity Framework,List,我有两个用户定义类型的列表 e、 g.List和列出User\u Master和User\u Master\u Temp都包含具有相同名称的相同类型的变量。 如何分配这些类型的列表 传统的做法是 userMaster.UserName = userMasterTemp.UserName; userMaster.UserEmail = userMasterTemp.UserEmail; userMaster.UserSalary = userMasterTemp.UserSalary; 为什么我

我有两个用户定义类型的列表 e、 g.
List
列出
User\u Master
User\u Master\u Temp
都包含具有相同名称的相同类型的变量。 如何分配这些类型的列表
传统的做法是

userMaster.UserName = userMasterTemp.UserName;
userMaster.UserEmail = userMasterTemp.UserEmail;
userMaster.UserSalary = userMasterTemp.UserSalary;
为什么我需要这个

我使用EF 5(数据库优先方法)和MVC 4,我在模型中应用数据注释验证,如果我更新edmx文件,然后运行自定义工具,我的所有验证都将消失。

因此,我编写了自己的视图模型类,它与原始模型类的视图模型类相同,并在该视图模型类中应用了数据注释

User_Master.Select(m=>new User_Master_Temp(){/*assign the Properties*/});
如果你用的是一个对象到对象的映射器,你可以用我用来做这个

var Mapping = new Mapping<User_Master, User_Master_Temp>();
Mapping.AutoRelateEqualNames();
User_Master.Select(m=>Mapping.Map(m));
var-Mapping=新映射();
Mapping.AutoRelateEqualNames();
User_Master.Select(m=>Mapping.Map(m));

您可以使用自动映射器映射对象

以下是文件:

您可以使用Visual Studio中的NUGET包获取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);
    }
}

或者,如果您不想使用工具,可以使用以下方法:

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 { }
        }
publicstaticvoidcopyidenticalobjects(对象源、对象目标)
{
FieldInfo[]destinationFields=destination.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
foreach(source.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)中的FieldInfo sourceField)
对于(int计数器=0;计数器
我不知道对象到对象映射器
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 { }
        }