3

(that i really don't know whether it would exist or even work)最近、変更されたインスタンスを使用してクラスのプロパティを自動更新するというアイデアを思いつきました。そして、私の考えをもう少し明確にするために、以下のコードで説明します。

//The first (Main) instance of the class
Employee carl = new Employee();
carl.Name = "Carl";
carl.Age = 20;
carl.Salary = 7000;

//Here is the same employee data collected from the database a year after...
Employee carl_one_year_later = new Employee();
carl_one_year_later.Age = 21;
carl_one_year_later.Salary = 10000;

//Here comes the idea... I wanna dynamically merge the new collected data to the current main instance of the employee, without missing out the unupdated data ex : his name
employee1 = employee2; //using this seems to overwrite the Name Field with null...

これを行うだけでこれを達成できると誰かが言うかもしれません:

carl.Age = carl_one_year_later.Age;
carl.Salary = carl_one_year_later.Salary;

ただし、1行のコードでこれを動的に実行し、C#にプロパティを処理させる動的な方法が必要setです。また、毎回プロパティを設定したくない大規模なクラスがある場合にも便利です。順次更新中です。

注意: 私のアイデアの明確なイメージを提供できることを願っています。必要なものを正確に理解するのに問題がある場合は、お知らせください。

4

5 に答える 5

2
using System;
using System.Reflection;

public class Test
{
    public class Employee
    {
        public String Name{get;set;}
        public int Age{get;set;}
        public int Salary{get;set;}
    }
    public static void Main()
    {
        Employee e1 = new Employee{Name="Old", Age=20, Salary=1000};
        Employee e2 = new Employee{Age=30, Salary=5000};

        Copy(e2, e1);

        Console.WriteLine(e1.Name+" "+ e1.Age+" "+e1.Salary );
    }

    public static void Copy<T>(T from, T to)
    {
        Type t = typeof (T);
        PropertyInfo[] props = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo p in props) {
            if (!p.CanRead || !p.CanWrite) continue;

            object val = p.GetGetMethod().Invoke(from, null);
            object defaultVal = p.PropertyType.IsValueType ? Activator.CreateInstance(p.PropertyType) : null;
            if (null != defaultVal && !val.Equals(defaultVal)) {
                p.GetSetMethod().Invoke(to, new[] {val});
            }
        }
    }
}
于 2013-10-16T03:35:14.370 に答える
1

CopyTo次のように拡張メソッドを作成できます。

public static class ObjectExtensions
{
    public static void CopyTo<T>(this T fromObj, T toObj)
    {
        foreach(var p in typeof(T).GetProperties()) 
        {
            p.SetValue(toObj, p.GetValue(fromObj, null), null);
        }
    }
}

そして、次のように呼び出します。

carl_one_year_later.CopyTo(carl);

ただし、正直なところ、さらにいくつかの確認を行う必要があり、代わりにAutoMapperなどを使用する方がよいでしょう。

于 2013-10-16T03:34:07.043 に答える
0

ICloneable または MemberwiseClone をチェックアウトします (ディープ コピーを行う必要がない限り。次に、Automapper、ValueInjecter などのオブジェクト マッパーをチェックアウトするか、独自のカスタム オブジェクト シリアル化ハイドレートを作成します)。

http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx

MemberwiseClone メソッドは、新しいオブジェクトを作成し、現在のオブジェクトの非静的フィールドを新しいオブジェクトにコピーすることによって浅いコピーを作成します。

http://msdn.microsoft.com/en-us/library/system.icloneable.aspx

AutoMapper の代替

于 2013-10-16T04:23:04.240 に答える
-1

アイデア自体が奇妙に思えます..

私自身、むしろやりたい:

//The first (Main) instance of the class
Employee carl = new Employee();
carl.Name = "Carl";
carl.Age = 20;
carl.Salary = 7000;

//Here we get Carl from the database
Employee carl = GetFromDatabase("Carl") //Illustration
carl.Age = 21;
carl.Salary = 10000;

あなたのコードは、今日のカールと来年のカールはまったく別の人であり、偶然にも同じ属性をすべて持っていると言っているようなものです。

それが本当に必要な場合は、私は Automapper を好む傾向があります..

于 2013-10-16T05:09:41.677 に答える