public static bool RemoveData([NotNull] this IExtendableObject extendableObject, string name)
        {
            if (extendableObject.ExtensionData == null)
            {
                return(false);
            }

            var json = JsonSerializer.Deserialize <Dictionary <string, Object> >(extendableObject.ExtensionData);

            var token = json[name];

            if (token == null)
            {
                return(false);
            }

            json.Remove(name);

            var data = JsonSerializer.Serialize(json);

            if (data == "{}")
            {
                data = null;
            }

            extendableObject.ExtensionData = data;

            return(true);
        }
        public static T GetData <T>(this IExtendableObject extendableObject, string name, JsonSerializer jsonSerializer)
        {
            CheckNotNull(extendableObject, name);

            if (extendableObject.ExtensionData == null)
            {
                return(default(T));
            }

            var json = JObject.Parse(extendableObject.ExtensionData);

            var prop = json[name];

            if (prop == null)
            {
                return(default(T));
            }

            if (TypeHelper.IsPrimitiveExtendedIncludingNullable(typeof(T)))
            {
                return(prop.Value <T>());
            }
            else
            {
                return((T)prop.ToObject(typeof(T), jsonSerializer ?? JsonSerializer.CreateDefault()));
            }
        }
        public static bool RemoveData([NotNull] this IExtendableObject extendableObject, string name)
        {
            if (extendableObject == null)
            {
                throw new ArgumentNullException(nameof(extendableObject));
            }

            if (extendableObject.ExtensionData == null)
            {
                return(false);
            }

            var json = JObject.Parse(extendableObject.ExtensionData);

            var token = json[name];

            if (token == null)
            {
                return(false);
            }

            json.Remove(name);

            var data = json.ToString(Formatting.None);

            if (data == "{}")
            {
                data = null;
            }

            extendableObject.ExtensionData = data;

            return(true);
        }
        public static T GetData <T>(this IExtendableObject extendableObject, string name, JsonSerializer jsonSerializer)
        {
            CheckNotNull(extendableObject, name);

            if (extendableObject.ExtensionData == null)
            {
                return(default);
示例#5
0
        public void Extend(StarSystem system)
        {
            Coords sectorCoords = new Coords(system.Coords.SectorIndexX, system.Coords.SectorIndexY);

            if (sectors.Contains(sectorCoords))
            {
                string baseDir = string.Format(
                    "./Data/Sector/s.{0}.{1}/Systems/s.{2}",
                    sectorCoords.SectorIndexX, sectorCoords.SectorIndexY,
                    system.SysNum
                    );

                Dictionary <string, string> properties = new Dictionary <string, string>();

                if (Directory.Exists(baseDir))
                {
                    string filename = Path.Combine(baseDir, "properties.txt");
                    properties = ReadProperties(filename);

                    IExtendableObject obj = system as IExtendableObject;
                    if (obj != null)
                    {
                        foreach (var key in properties.Keys)
                        {
                            obj.ExtendedProperties.SetValue(key.ToLower(), properties[key]);
                        }
                    }
                }
            }
        }
示例#6
0
        public void Extend(SystemBody body)
        {
            Coords sectorCoords = new Coords(body.StarSystem.Coords.SectorIndexX, body.StarSystem.Coords.SectorIndexY);

            if (sectors.Contains(sectorCoords))
            {
                string baseDir = GetExtentionDir(body);

                Dictionary <string, string> properties = new Dictionary <string, string>();

                if (Directory.Exists(baseDir))
                {
                    string filename = Path.Combine(baseDir, "properties.txt");
                    properties = ReadProperties(filename);

                    IExtendableObject obj = body as IExtendableObject;
                    if (obj != null)
                    {
                        foreach (var key in properties.Keys)
                        {
                            obj.ExtendedProperties.SetValue(key.ToLower(), properties[key]);
                        }
                    }
                }
            }
        }
        public static void SetData <T>([NotNull] this IExtendableObject extendableObject, [NotNull] string name, T value)
        {
            if (extendableObject.ExtensionData == null)
            {
                if (EqualityComparer <T> .Default.Equals(value, default(T)))
                {
                    return;
                }
                extendableObject.ExtensionData = "{}";
            }

            var json = JsonSerializer.Deserialize <Dictionary <string, Object> >(extendableObject.ExtensionData);

            if (value == null || EqualityComparer <T> .Default.Equals(value, default(T)))
            {
                if (json[name] != null)
                {
                    json.Remove(name);
                }
            }

            json.Add(name, value);

            var data = JsonSerializer.Serialize(json);

            if (data == "{}")
            {
                data = null;
            }
            extendableObject.ExtensionData = data;
        }
        public static bool RemoveData(this IExtendableObject extendableObject, string name)
        {
            CheckNotNull(extendableObject, name);

            if (extendableObject.ExtensionData == null)
            {
                return(false);
            }

            var json = JObject.Parse(extendableObject.ExtensionData);

            var token = json[name];

            if (token == null)
            {
                return(false);
            }

            json.Remove(name);

            var data = json.ToString(Formatting.None);

            if (data == "{}")
            {
                data = null;
            }

            extendableObject.ExtensionData = data;

            return(true);
        }
示例#9
0
        public ExtendedObjectTracker(IExtendableObject entity, string key)
        {
            _entity = entity;
            _key    = key;

            Obj        = entity.GetData <T>(key);
            _beginJson = JsonConvert.SerializeObject(Obj);
        }
        public static List <KeyValuePair <string, string> > GetKeyValuePairData(
            this IExtendableObject extendableObject)
        {
            JObject json = JObject.Parse(extendableObject.ExtensionData);
            Dictionary <string, string> kVP = (Dictionary <string, string>)json.ToObject(typeof(Dictionary <string, string>));

            return(kVP.ToList <KeyValuePair <string, string> >());
        }
示例#11
0
        public static T GetData <T>([NotNull] this IExtendableObject extendableObject, [NotNull] string name)
        {
            if (extendableObject.ExtensionData == null)
            {
                return(default(T));
            }
            var json = JsonSerializer.Deserialize <Dictionary <string, JsonElement> >(extendableObject.ExtensionData);
            var prop = json[name];

            return(prop.Get <T>());
        }
示例#12
0
 public static T GetData <T>([NotNull] this IExtendableObject extendableObject, [NotNull] string name, bool handleType = false)
 {
     return(extendableObject.GetData <T>(
                name,
                handleType
             ? new JsonSerializer {
         TypeNameHandling = TypeNameHandling.All
     }
             : JsonSerializer.CreateDefault()
                ));
 }
示例#13
0
        public static void SetData <T>([NotNull] this IExtendableObject extendableObject, [NotNull] string name, [CanBeNull] T value, [CanBeNull] JsonSerializer jsonSerializer)
        {
            if (extendableObject == null)
            {
                throw new ArgumentNullException(nameof(extendableObject));
            }

            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (jsonSerializer == null)
            {
                jsonSerializer = JsonSerializer.CreateDefault();
            }

            if (extendableObject.ExtensionData == null)
            {
                if (EqualityComparer <T> .Default.Equals(value, default(T)))
                {
                    return;
                }

                extendableObject.ExtensionData = "{}";
            }

            var json = JObject.Parse(extendableObject.ExtensionData);

            if (value == null || EqualityComparer <T> .Default.Equals(value, default(T)))
            {
                if (json[name] != null)
                {
                    json.Remove(name);
                }
            }
            else if (TypeHelper.IsPrimitiveExtendedIncludingNullable(value.GetType()))
            {
                json[name] = new JValue(value);
            }
            else
            {
                json[name] = JToken.FromObject(value, jsonSerializer);
            }

            var data = json.ToString(Formatting.None);

            if (data == "{}")
            {
                data = null;
            }

            extendableObject.ExtensionData = data;
        }
 public static void SetData <T>(this IExtendableObject extendableObject, string name, T value, bool handleType = false)
 {
     extendableObject.SetData(
         name,
         value,
         handleType
             ? new JsonSerializer {
         TypeNameHandling = TypeNameHandling.All
     }
             : JsonSerializer.CreateDefault()
         );
 }
 private static void SetMemberByName <TMember>(this IExtendableObject dynamicObject, TMember value, string memberName)
 {
     lock (dynamicObject)
     {
         if (dynamicObject.Cache.ContainsKey(memberName))
         {
             dynamicObject.Cache[memberName] = value;
         }
         else
         {
             dynamicObject.Cache.Add(memberName, value);
         }
     }
 }
    /// <summary>
    /// The first time when the function is invoked for a specific member, the member value is evaluated. Further calls will return always the same value.
    /// </summary>
    /// <typeparam name="TMember">The type of the member.</typeparam>
    /// <param name="dynamicObject">The extendable object on which the extension is invoked.</param>
    /// <param name="getInitialValue">A function that returns the initial member value.</param>
    /// <param name="memberNameOrKey">When specified, overrides the member name of the calling function that is used as a key for the value cache.</param>
    /// <param name="initializeWhenDefault">Determines whether the value is reevaluated as long as the previous evaluation returned the default of the value type.</param>
    /// <param name="forceRefresh">Determines whether the value should be reevaluated again, even if its already initialized.</param>
    /// <param name="onInitialized">A hook that can be specified, to determine whether the value was initialized and/or to modify the value before it is stored.</param>
    /// <returns>The member value.</returns>
    public static TMember Get <TMember>(this IExtendableObject dynamicObject, Func <TMember> getInitialValue,
                                        [CallerMemberName] string memberNameOrKey = null, bool initializeWhenDefault = false, bool forceRefresh = false, Action <TMember> onInitialized = null)
    {
        if (memberNameOrKey == null)
        {
            throw new ArgumentNullException(nameof(memberNameOrKey));
        }
        var memberName = memberNameOrKey;

        if (forceRefresh || !dynamicObject.Cache.TryGetValue(memberName, out var member) ||
            initializeWhenDefault && Equals(member, default(TMember)))
        {
            lock (dynamicObject)
            {
                if (forceRefresh || !dynamicObject.Cache.TryGetValue(memberName, out member) ||
                    initializeWhenDefault && Equals(member, default(TMember)))
                {
                    member = getInitialValue == null ? default(TMember) : getInitialValue();

                    if (onInitialized != null)
                    {
#pragma warning disable CS8604 // Possible null reference argument.
                        onInitialized((TMember)member);
#pragma warning restore CS8604 // Possible null reference argument.
                    }

                    var cache = dynamicObject.Cache;
                    if (cache.ContainsKey(memberName))
                    {
                        cache[memberName] = member;
                    }
                    else
                    {
                        cache.Add(memberName, member);
                    }
                }
            }
        }

#pragma warning disable CS8603 // Possible null reference return.
        return((TMember)member);

#pragma warning restore CS8603 // Possible null reference return.
    }
        public static T GetData <T>(this IExtendableObject extendableObject, string name, bool handleType = false)
        {
            CheckNotNull(extendableObject, name);

            if (extendableObject == null)
            {
                throw new ArgumentNullException(nameof(extendableObject));
            }
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            return(extendableObject.GetData <T>(
                       name,
                       handleType
                    ? new JsonSerializer {
                TypeNameHandling = TypeNameHandling.All
            }
                    : JsonSerializer.CreateDefault()
                       ));
        }
        public static void MapAdditionalProperties <TEntity>(this EntityEntry <TEntity> entry, IExtendableObject target)
            where TEntity : class
        {
            foreach (var item in entry.Metadata.GetProperties().Where(p => p.IsShadowProperty()))
            {
                if (item == entry.Metadata.GetDiscriminatorProperty())
                {
                    continue;
                }

                var value = entry.CurrentValues[item];
                target.AdditionalProperties.Add(item.Name.ToLower(), value);
            }
        }
 /// <summary>
 /// Sets the value of a extension property.
 /// </summary>
 /// <typeparam name="TMember">The type of the extension property.</typeparam>
 /// <param name="dynamicObject">The dynamic object on which the extension is invoked.</param>
 /// <param name="value">The value that should be set.</param>
 /// <param name="memberName">The name / key of the member.</param>
 public static void Set <TMember>(this IExtendableObject dynamicObject, TMember value, [CallerMemberName] string memberName = null)
 {
     dynamicObject.SetMemberByName(value, memberName.NullCheck());
 }
 public static void ClearCache(this IExtendableObject dynamicObject)
 {
     dynamicObject.Cache.Clear();
 }
    /// <summary>
    /// Determines whether a member with the specified name is already available in the dynamic object cache.
    /// </summary>
    /// <param name="dynamicObject">The dynamic object on which the extension is invoked.</param>
    /// <param name="memberName">The name / key of the member to look for.</param>
    /// <returns>true, if a member entry exists, otherwise false.</returns>
    public static bool HasMember(this IExtendableObject dynamicObject, String memberName)
    {
        var hasMember = dynamicObject.Cache.ContainsKey(memberName);

        return(hasMember);
    }
        public static void UpdateAdditionalProperties <TEntity>(this EntityEntry <TEntity> entry, IExtendableObject target)
            where TEntity : class
        {
            foreach (var item in entry.Metadata.GetProperties().Where(p => p.IsShadowProperty()))
            {
                if (item == entry.Metadata.GetDiscriminatorProperty())
                {
                    continue;
                }

                if (target.AdditionalProperties.TryGetValue(item.Name.ToLower(), out var value))
                {
                    if (value is JsonElement json)
                    {
                        value = System.Text.Json.JsonSerializer.Deserialize(json.GetRawText(), item.ClrType);
                    }

                    entry.CurrentValues[item] = value;
                }
            }
        }
示例#23
0
 public static ExtendedObjectTracker <T> GetTrackedData <T>(
     this IExtendableObject extendableObject,
     string name)
 {
     return(new ExtendedObjectTracker <T>(extendableObject, name));
 }