前書いたやつはプロパティしかコピーしてなかったのでフィールドもコピーするバージョン。
//使い方 //CopySameNameProperty(コピー元Object,コピー先Object) public static void CopySameNameProperty(object from, object to) { //それぞれのタイプを取得 Type fromType = from.GetType(); Type toType = to.GetType(); //メンバーリスト MemberInfo[] fromMembers = fromType.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); MemberInfo[] toMembers = toType.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); //名称用のリストを用意 List<string> nameList = new List<string>(); foreach (MemberInfo m in toMembers) { //プロパティとフィールドの場合のみ if (m.MemberType == MemberTypes.Property || m.MemberType == MemberTypes.Field) { nameList.Add(m.Name); } } //同名プロパティとフィールドの値をコピー foreach (MemberInfo m in fromMembers) { if (m.MemberType == MemberTypes.Property) { //同名のプパティがあれば転送する if (nameList.Contains(m.Name)) { toType.GetProperty(m.Name).SetValue(to, fromType.GetProperty(m.Name).GetValue(from, null)); } } else if(m.MemberType == MemberTypes.Field) { //同名のフィールドがあれば転送する if (nameList.Contains(m.Name)) { toType.GetField(m.Name).SetValue(to, fromType.GetField(m.Name).GetValue(from)); } } } }
いちを、↓の感じくらいのオブジェクトだったら全部コピーしてくれる。
public class HogeClass { //プロパティ public string s { get; set; } public string t { get; set; } public string r { get; set; } public List<int> list1 { get; set; } public FugaClass propertyclass { get; set; } //フィールド public string fieldstr = ""; public List<int> list2 = new List<int>(); public FugaClass fieldclass = new FugaClass(); }