THRIFT-5216 generate DeepCopy methods
Client: netstd
Patch: Jens Geyer

This closes #2155
diff --git a/lib/netstd/Thrift/Collections/TCollections.cs b/lib/netstd/Thrift/Collections/TCollections.cs
index 147bfc7..b386c37 100644
--- a/lib/netstd/Thrift/Collections/TCollections.cs
+++ b/lib/netstd/Thrift/Collections/TCollections.cs
@@ -16,11 +16,12 @@
 // under the License.
 
 using System.Collections;
+using System.Collections.Generic;
 
 namespace Thrift.Collections
 {
     // ReSharper disable once InconsistentNaming
-    public class TCollections
+    public static class TCollections
     {
         /// <summary>
         ///     This will return true if the two collections are value-wise the same.
@@ -38,6 +39,18 @@
                 return false;
             }
 
+            // for dictionaries, we need to compare keys and values separately
+            // because KeyValuePair<K,V>.Equals() will not do what we want
+            var fdict = first as IDictionary;
+            var sdict = second as IDictionary;
+            if ((fdict != null) || (sdict != null))
+            {
+                if ((fdict == null) || (sdict == null))
+                    return false;
+                return TCollections.Equals(fdict.Keys, sdict.Keys)
+                    && TCollections.Equals(fdict.Values, sdict.Values);
+            }
+
             var fiter = first.GetEnumerator();
             var siter = second.GetEnumerator();
 
@@ -91,11 +104,13 @@
 
                 unchecked
                 {
-                    hashcode = (hashcode*397) ^ (objHash);
+                    hashcode = (hashcode * 397) ^ (objHash);
                 }
             }
 
             return hashcode;
         }
+
+
     }
-}
\ No newline at end of file
+}
diff --git a/lib/netstd/Thrift/Collections/THashSet.cs b/lib/netstd/Thrift/Collections/THashSet.cs
index ffab577..8dfb9e3 100644
--- a/lib/netstd/Thrift/Collections/THashSet.cs
+++ b/lib/netstd/Thrift/Collections/THashSet.cs
@@ -60,12 +60,12 @@
             Items.CopyTo(array, arrayIndex);
         }
 
-        public IEnumerator GetEnumerator()
+        IEnumerator IEnumerable.GetEnumerator()
         {
             return Items.GetEnumerator();
         }
 
-        IEnumerator<T> IEnumerable<T>.GetEnumerator()
+        public IEnumerator<T> GetEnumerator()
         {
             return ((IEnumerable<T>) Items).GetEnumerator();
         }
diff --git a/lib/netstd/Thrift/Collections/ToStringExtension.cs b/lib/netstd/Thrift/Collections/ToStringExtension.cs
deleted file mode 100644
index 40dd9dd..0000000
--- a/lib/netstd/Thrift/Collections/ToStringExtension.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-// Licensed to the Apache Software Foundation(ASF) under one
-// or more contributor license agreements.See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-// 
-//     http://www.apache.org/licenses/LICENSE-2.0
-// 
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Text;
-using Thrift.Protocol;
-
-namespace Thrift.Collections
-{
-
-
-    public static class ToStringExtensions
-    {
-        public static void ToString(this object self, StringBuilder sb, bool first = true)
-        {
-            if (!first)
-                sb.Append(", ");
-
-            bool first_child = true;
-            if (self is string) // string is IEnumerable
-            {
-                sb.Append('"');
-                sb.Append(self);
-                sb.Append('"');
-            }
-            else if (self is IDictionary)
-            {
-                sb.Append("{ ");
-                foreach (DictionaryEntry pair in (self as IDictionary))
-                {
-                    if (first_child)
-                        first_child = false;
-                    else
-                        sb.Append(",");
-
-                    sb.Append("{ ");
-                    pair.Key.ToString(sb);
-                    sb.Append(", ");
-                    pair.Value.ToString(sb);
-                    sb.Append("}");
-                }
-                sb.Append("}");
-            }
-            else if (self is IEnumerable)
-            {
-                sb.Append("{ ");
-                foreach (var elm in (self as IEnumerable))
-                {
-                    elm.ToString(sb, first_child);
-                    first_child = false;
-                }
-                sb.Append("}");
-            }
-            else if (self is TBase)
-            {
-                sb.Append((self as TBase).ToString());
-            }
-            else
-            {
-                sb.Append(self.ToString());
-            }
-        }
-    }
-
-
-}