SerializableDictionary.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Runtime.CompilerServices;
  5. namespace BansheeEngine
  6. {
  7. #pragma warning disable 649
  8. public sealed class SerializableDictionary : ScriptObject
  9. {
  10. private SerializableProperty.FieldType keyType;
  11. private SerializableProperty.FieldType valueType;
  12. private Type internalKeyType;
  13. private Type internalValueType;
  14. private IDictionary referencedDict;
  15. public SerializableProperty.FieldType KeyType
  16. {
  17. get { return keyType; }
  18. }
  19. public SerializableProperty.FieldType ValueType
  20. {
  21. get { return valueType; }
  22. }
  23. // Constructed from native code
  24. private SerializableDictionary(IDictionary dict, Type internalKeyType, Type internalValueType)
  25. {
  26. referencedDict = dict;
  27. this.internalKeyType = internalKeyType;
  28. this.internalValueType = internalValueType;
  29. keyType = SerializableProperty.DetermineFieldType(internalKeyType);
  30. valueType = SerializableProperty.DetermineFieldType(internalValueType);
  31. }
  32. public KeyValuePair<SerializableProperty, SerializableProperty> GetProperty(object key)
  33. {
  34. if (!referencedDict.Contains(key))
  35. return new KeyValuePair<SerializableProperty, SerializableProperty>(null, null);
  36. SerializableProperty keyProperty;
  37. {
  38. SerializableProperty.Getter getter = () => key;
  39. SerializableProperty.Setter setter = (object value) => {};
  40. keyProperty = Internal_CreateKeyProperty(mCachedPtr);
  41. keyProperty.Construct(KeyType, internalKeyType, getter, setter);
  42. }
  43. SerializableProperty valueProperty;
  44. {
  45. SerializableProperty.Getter getter = () => referencedDict[key];
  46. SerializableProperty.Setter setter = (object value) => referencedDict[key] = value;
  47. valueProperty = Internal_CreateValueProperty(mCachedPtr);
  48. valueProperty.Construct(ValueType, internalValueType, getter, setter);
  49. }
  50. return new KeyValuePair<SerializableProperty, SerializableProperty>(keyProperty, valueProperty);
  51. }
  52. public int GetLength()
  53. {
  54. return referencedDict.Count;
  55. }
  56. [MethodImpl(MethodImplOptions.InternalCall)]
  57. private static extern SerializableProperty Internal_CreateKeyProperty(IntPtr nativeInstance);
  58. [MethodImpl(MethodImplOptions.InternalCall)]
  59. private static extern SerializableProperty Internal_CreateValueProperty(IntPtr nativeInstance);
  60. }
  61. }