فهرست منبع

Merge pull request #65905 from raulsntos/dotnet/marshaling-collections

C#: Fix marshaling generic Godot collections
Ignacio Roldán Etcheverry 2 سال پیش
والد
کامیت
5826e96014

+ 9 - 1
modules/mono/glue/GodotSharp/GodotSharp/Core/Array.cs

@@ -474,6 +474,11 @@ namespace Godot.Collections
         }
     }
 
+    internal interface IGenericGodotArray
+    {
+        public Array UnderlyingArray { get; }
+    }
+
     /// <summary>
     /// Typed wrapper around Godot's Array class, an array of Variant
     /// typed elements allocated in the engine in C++. Useful when
@@ -487,7 +492,8 @@ namespace Godot.Collections
         IList<T>,
         IReadOnlyList<T>,
         ICollection<T>,
-        IEnumerable<T>
+        IEnumerable<T>,
+        IGenericGodotArray
     {
         private static godot_variant ToVariantFunc(in Array<T> godotArray) =>
             VariantUtils.CreateFromArray(godotArray);
@@ -503,6 +509,8 @@ namespace Godot.Collections
 
         private readonly Array _underlyingArray;
 
+        Array IGenericGodotArray.UnderlyingArray => _underlyingArray;
+
         internal ref godot_array.movable NativeValue
         {
             [MethodImpl(MethodImplOptions.AggressiveInlining)]

+ 9 - 1
modules/mono/glue/GodotSharp/GodotSharp/Core/Dictionary.cs

@@ -344,6 +344,11 @@ namespace Godot.Collections
         }
     }
 
+    internal interface IGenericGodotDictionary
+    {
+        public Dictionary UnderlyingDictionary { get; }
+    }
+
     /// <summary>
     /// Typed wrapper around Godot's Dictionary class, a dictionary of Variant
     /// typed elements allocated in the engine in C++. Useful when
@@ -354,7 +359,8 @@ namespace Godot.Collections
     /// <typeparam name="TValue">The type of the dictionary's values.</typeparam>
     public class Dictionary<[MustBeVariant] TKey, [MustBeVariant] TValue> :
         IDictionary<TKey, TValue>,
-        IReadOnlyDictionary<TKey, TValue>
+        IReadOnlyDictionary<TKey, TValue>,
+        IGenericGodotDictionary
     {
         private static godot_variant ToVariantFunc(in Dictionary<TKey, TValue> godotDictionary) =>
             VariantUtils.CreateFromDictionary(godotDictionary);
@@ -370,6 +376,8 @@ namespace Godot.Collections
 
         private readonly Dictionary _underlyingDict;
 
+        Dictionary IGenericGodotDictionary.UnderlyingDictionary => _underlyingDict;
+
         internal ref godot_dictionary.movable NativeValue
         {
             [MethodImpl(MethodImplOptions.AggressiveInlining)]

+ 4 - 0
modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs

@@ -293,6 +293,10 @@ namespace Godot.NativeInterop
                     return VariantUtils.CreateFromDictionary(godotDictionary);
                 case Collections.Array godotArray:
                     return VariantUtils.CreateFromArray(godotArray);
+                case Collections.IGenericGodotDictionary godotDictionary:
+                    return VariantUtils.CreateFromDictionary(godotDictionary.UnderlyingDictionary);
+                case Collections.IGenericGodotArray godotArray:
+                    return VariantUtils.CreateFromArray(godotArray.UnderlyingArray);
                 case Variant variant:
                     return NativeFuncs.godotsharp_variant_new_copy((godot_variant)variant.NativeVar);
             }