2

ユーザー定義型の 2 つのリストがList<User_Master>ありList<User_Master_Tempます。これらのタイプのリストを割り当てるにはどうすればよいですか? 伝統的なやり方は User_MasterUser_Master_Temp

userMaster.UserName = userMasterTemp.UserName;
userMaster.UserEmail = userMasterTemp.UserEmail;
userMaster.UserSalary = userMasterTemp.UserSalary;

なぜこれが必要なのですか?

私は EF 5 (DataBase First Approach) と MVC 4 を使用しています。モデルにデータ注釈の検証を適用し、edmx ファイルを更新してからカスタム ツールを実行すると、すべての検証が消えます。

そこで、元のモデル クラスと同じ独自のビュー モデル クラスを作成し、そのビュー モデル クラスにデータ注釈を適用しました。

4

4 に答える 4

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
于 2013-04-13T11:49:57.287 に答える
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 { }
        }
于 2013-04-16T22:22:33.060 に答える
1
User_Master.Select(m=>new User_Master_Temp(){/*assign the Properties*/});

オブジェクトからオブジェクトへのマッパーを使用している場合は、これを使用できます。これにはGlueを使用します。

var Mapping = new Mapping<User_Master, User_Master_Temp>();
Mapping.AutoRelateEqualNames();
User_Master.Select(m=>Mapping.Map(m));
于 2013-04-13T10:53:19.340 に答える