rksoftware

Visual Studio とか C# とかが好きです

異なる型のオブジェクトに同じ名前のプロパティの値を全てセットする

大量のプロパティを持つオブジェクト間でプロパティの値をコピーしたいことがあります。
毎回コピーするコードを書くのも面倒なので、メモをしておきます。
下記コードの PropertyCopier クラスの CopyTo メソッドでコピーできます。

public static class PropertyCopier
{
    public static T CopyTo<T>(object src, T dest)
    {
        if (src == null || dest == null) return dest;
        var srcProperties = src.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).Where(p => p.CanRead && p.CanWrite);
        var destProperties = dest.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).Where(p => p.CanRead && p.CanWrite);
        var properties = srcProperties.Join(destProperties, p => new { p.Name,p.PropertyType}, p => new { p.Name, p.PropertyType }, (p1, p2) => new { p1, p2 });
        foreach (var property in properties)
            property.p2.SetValue(dest, property.p1.GetValue(src));
        return dest;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var dest = PropertyCopier.CopyTo(new Test1() { Prop1 = "p1", Prop2 = "p2", Prop3 = "p3" }, new Test2());
        Console.WriteLine($"{dest.Prop1}, {dest.Prop2}, {dest.Prop3}");

        Console.ReadKey();
    }
}

public class Test1
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
}

public class Test2
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
}