| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.CompilerServices;
- using System.Text;
- namespace BansheeEngine
- {
- /// <summary>
- /// Allows you to access meta-data about field in an object. Similar to Reflection but simpler and faster.
- /// </summary>
- public class SerializableField : ScriptObject
- {
- private SerializableObject parent;
- private SerializableProperty.FieldType type;
- private int flags;
- private Type internalType;
- private string name;
- /// <summary>
- /// Constructor for internal use by the runtime.
- /// </summary>
- /// <param name="parent">Object that conains the field.</param>
- /// <param name="name">Name of the field.</param>
- /// <param name="flags">Flags that control whether the field is inspectable or serializable.</param>
- /// <param name="internalType">Internal C# type of the field.</param>
- private SerializableField(SerializableObject parent, string name, int flags, Type internalType)
- {
- this.parent = parent;
- this.name = name;
- this.flags = flags;
- this.type = SerializableProperty.DetermineFieldType(internalType);
- this.internalType = internalType;
- }
- /// <summary>
- /// Returns the type of data contained in the field.
- /// </summary>
- public SerializableProperty.FieldType Type
- {
- get { return type; }
- }
- /// <summary>
- /// Returns the name of the field.
- /// </summary>
- public string Name
- {
- get { return name; }
- }
- /// <summary>
- /// Returns true if the field will be visible in the default inspector.
- /// </summary>
- public bool Inspectable
- {
- get { return (flags & 0x02) != 0; } // Flags as defined in native code in BsManagedSerializableObjectInfo.h
- }
- /// <summary>
- /// Returns true if the field will be automatically serialized.
- /// </summary>
- public bool Serializable
- {
- get { return (flags & 0x01) != 0; } // Flags as defined in native code in BsManagedSerializableObjectInfo.h
- }
- /// <summary>
- /// Returns a serializable property for the field.
- /// </summary>
- /// <returns>Serializable property that allows you to manipulate contents of the field.</returns>
- public SerializableProperty GetProperty()
- {
- SerializableProperty.Getter getter = () =>
- {
- object parentObject = parent.GetReferencedObject();
-
- if (parentObject != null)
- return Internal_GetValue(mCachedPtr, parentObject);
- else
- return null;
- };
- SerializableProperty.Setter setter = (object value) =>
- {
- object parentObject = parent.GetReferencedObject();
- if (parentObject != null)
- {
- Internal_SetValue(mCachedPtr, parentObject, value);
- // If value type we cannot just modify the parent object because it's just a copy
- if (parentObject.GetType().IsValueType && parent.parentProperty != null)
- parent.parentProperty.SetValue(parentObject);
- }
- };
- SerializableProperty newProperty = Internal_CreateProperty(mCachedPtr);
- newProperty.Construct(type, internalType, getter, setter);
- return newProperty;
- }
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern SerializableProperty Internal_CreateProperty(IntPtr nativeInstance);
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern object Internal_GetValue(IntPtr nativeInstance, object instance);
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void Internal_SetValue(IntPtr nativeInstance, object instance, object value);
- }
- }
|