SerializableList.cs 2.0 KB

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