diff --git a/MLEM.Data/CopyExtensions.cs b/MLEM.Data/CopyExtensions.cs
new file mode 100644
index 0000000..dbe03b9
--- /dev/null
+++ b/MLEM.Data/CopyExtensions.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Reflection;
+
+namespace MLEM.Data {
+ ///
+ /// A set of extensions for dealing with copying objects.
+ ///
+ public static class CopyExtensions {
+
+ ///
+ /// Creates a shallow copy of the object and returns it.
+ /// Note that, for this to work correctly, needs to contain a parameterless constructor.
+ ///
+ /// The object to create a shallow copy of
+ /// The binding flags for field searching
+ /// The type of the object to copy
+ /// A shallow copy of the object
+ public static T Copy(this T obj, BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) {
+ var copy = (T) typeof(T).GetConstructor(Type.EmptyTypes).Invoke(null);
+ obj.CopyInto(copy, flags);
+ return copy;
+ }
+
+ ///
+ /// Copies the given object into the given object .
+ ///
+ /// The object to create a shallow copy of
+ /// The object to copy into
+ /// The binding flags for field searching
+ /// The type of the object to copy
+ public static void CopyInto(this T obj, T otherObj, BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) {
+ foreach (var field in typeof(T).GetFields(flags))
+ field.SetValue(otherObj, field.GetValue(obj));
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Sandbox/GameImpl.cs b/Sandbox/GameImpl.cs
index bb9e9a1..9012b2f 100644
--- a/Sandbox/GameImpl.cs
+++ b/Sandbox/GameImpl.cs
@@ -96,6 +96,14 @@ namespace Sandbox {
RectangleF = new RectangleF(4, 5, 6, 7).ToMlem(),
Dir = Direction2.Left
};
+ Console.WriteLine(obj);
+
+ var copy = obj.Copy();
+ Console.WriteLine(copy);
+
+ var intoCopy = new Test();
+ obj.CopyInto(intoCopy);
+ Console.WriteLine(intoCopy);
var writer = new StringWriter();
this.Content.GetJsonSerializer().Serialize(writer, obj);
@@ -208,7 +216,7 @@ namespace Sandbox {
public Point Point;
public Rectangle Rectangle;
public MLEM.Misc.RectangleF RectangleF;
- public Direction2 Dir;
+ public Direction2 Dir { get; set; }
public override string ToString() {
return $"{nameof(this.Vec)}: {this.Vec}, {nameof(this.Point)}: {this.Point}, {nameof(this.Rectangle)}: {this.Rectangle}, {nameof(this.RectangleF)}: {this.RectangleF}, {nameof(this.Dir)}: {this.Dir}";