前書いたやつはプロパティしかコピーしてなかったのでフィールドもコピーするバージョン。

//使い方
//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();
}