C#: Fix marshaling generic Godot collections

Add support for generic Godot collections to
`ConvertManagedObjectToVariant`.
This commit is contained in:
Raul Santos 2022-09-16 13:46:34 +02:00
parent c2babb6558
commit 7535803023
No known key found for this signature in database
GPG key ID: B532473AE3A803E4
3 changed files with 22 additions and 2 deletions

View file

@ -474,6 +474,11 @@ namespace Godot.Collections
} }
} }
internal interface IGenericGodotArray
{
public Array UnderlyingArray { get; }
}
/// <summary> /// <summary>
/// Typed wrapper around Godot's Array class, an array of Variant /// Typed wrapper around Godot's Array class, an array of Variant
/// typed elements allocated in the engine in C++. Useful when /// typed elements allocated in the engine in C++. Useful when
@ -487,7 +492,8 @@ namespace Godot.Collections
IList<T>, IList<T>,
IReadOnlyList<T>, IReadOnlyList<T>,
ICollection<T>, ICollection<T>,
IEnumerable<T> IEnumerable<T>,
IGenericGodotArray
{ {
// ReSharper disable StaticMemberInGenericType // ReSharper disable StaticMemberInGenericType
// Warning is about unique static fields being created for each generic type combination: // Warning is about unique static fields being created for each generic type combination:
@ -516,6 +522,8 @@ namespace Godot.Collections
private readonly Array _underlyingArray; private readonly Array _underlyingArray;
Array IGenericGodotArray.UnderlyingArray => _underlyingArray;
internal ref godot_array.movable NativeValue internal ref godot_array.movable NativeValue
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]

View file

@ -344,6 +344,11 @@ namespace Godot.Collections
} }
} }
internal interface IGenericGodotDictionary
{
public Dictionary UnderlyingDictionary { get; }
}
/// <summary> /// <summary>
/// Typed wrapper around Godot's Dictionary class, a dictionary of Variant /// Typed wrapper around Godot's Dictionary class, a dictionary of Variant
/// typed elements allocated in the engine in C++. Useful when /// 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> /// <typeparam name="TValue">The type of the dictionary's values.</typeparam>
public class Dictionary<[MustBeVariant] TKey, [MustBeVariant] TValue> : public class Dictionary<[MustBeVariant] TKey, [MustBeVariant] TValue> :
IDictionary<TKey, TValue>, IDictionary<TKey, TValue>,
IReadOnlyDictionary<TKey, TValue> IReadOnlyDictionary<TKey, TValue>,
IGenericGodotDictionary
{ {
// ReSharper disable StaticMemberInGenericType // ReSharper disable StaticMemberInGenericType
// Warning is about unique static fields being created for each generic type combination: // Warning is about unique static fields being created for each generic type combination:
@ -393,6 +399,8 @@ namespace Godot.Collections
private readonly Dictionary _underlyingDict; private readonly Dictionary _underlyingDict;
Dictionary IGenericGodotDictionary.UnderlyingDictionary => _underlyingDict;
internal ref godot_dictionary.movable NativeValue internal ref godot_dictionary.movable NativeValue
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]

View file

@ -293,6 +293,10 @@ namespace Godot.NativeInterop
return VariantUtils.CreateFromDictionary(godotDictionary); return VariantUtils.CreateFromDictionary(godotDictionary);
case Collections.Array godotArray: case Collections.Array godotArray:
return VariantUtils.CreateFromArray(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: case Variant variant:
return NativeFuncs.godotsharp_variant_new_copy((godot_variant)variant.NativeVar); return NativeFuncs.godotsharp_variant_new_copy((godot_variant)variant.NativeVar);
} }