SerializableArray.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. namespace BansheeEngine
  4. {
  5. #pragma warning disable 649
  6. public sealed class SerializableArray : ScriptObject
  7. {
  8. private SerializableProperty.FieldType elementType;
  9. private Type internalElementType;
  10. private SerializableProperty parentProperty;
  11. public SerializableProperty.FieldType ElementType
  12. {
  13. get { return elementType; }
  14. }
  15. // Constructed from native code
  16. private SerializableArray(Type internalElementType, SerializableProperty parentProperty)
  17. {
  18. this.parentProperty = parentProperty;
  19. this.internalElementType = internalElementType;
  20. elementType = SerializableProperty.DetermineFieldType(internalElementType);
  21. }
  22. public SerializableProperty GetProperty(int elementIdx)
  23. {
  24. SerializableProperty.Getter getter = () =>
  25. {
  26. Array array = parentProperty.GetValue<Array>();
  27. if (array != null)
  28. return array.GetValue(elementIdx);
  29. else
  30. return null;
  31. };
  32. SerializableProperty.Setter setter = (object value) =>
  33. {
  34. Array array = parentProperty.GetValue<Array>();
  35. if(array != null)
  36. array.SetValue(value, elementIdx);
  37. };
  38. SerializableProperty property = Internal_CreateProperty(mCachedPtr);
  39. property.Construct(ElementType, internalElementType, getter, setter);
  40. return property;
  41. }
  42. public int GetLength()
  43. {
  44. Array array = parentProperty.GetValue<Array>();
  45. if (array != null)
  46. return array.GetLength(0); // TODO - Support multi-rank arrays
  47. else
  48. return 0;
  49. }
  50. [MethodImpl(MethodImplOptions.InternalCall)]
  51. private static extern SerializableProperty Internal_CreateProperty(IntPtr nativeInstance);
  52. }
  53. }