/// <summary> /// Private method used by all gets that handles getting a parameter. /// Note that if a parameter is not defined, the default for that type is returned /// </summary> /// <typeparam name="T">The type of the parameter to get</typeparam> /// <param name="name">The name of the parameter to get</param> /// <param name="serverSide">True if this parameter should be NOT syncronized with peers</param> private T GetValueInternal <T>(string name, bool serverSide = false) { // If we have that parameter, then get it if (myParameters.ContainsKey(name)) { // Get the object value object value = myParameters[name].RawValue; // Verify type before returning if (value == null) { return(default(T)); } else if (typeof(T).IsAssignableFrom(value.GetType())) { return((T)value); } else if (Utils.CanChangeType(value, typeof(T))) { return((T)Convert.ChangeType(value, typeof(T))); } else { throw new InvalidCastException(string.Format("Cannot cast {0} to {1}", value.GetType().Name, typeof(T).Name)); } } // Otherwise make a default one else { // Add and return a default parameter of type T myParameters.Add(name, StateParameter.Construct(name, default(T), !serverSide)); return(myParameters[name].GetValueInternal <T>()); } }
/// <summary> /// Gets the state parameter with the given name /// </summary> /// <param name="name">The name of the parameter</param> /// <param name="serverSide">Whether or not this game state is not syncronized</param> /// <returns>The parameter with the given name</returns> public StateParameter GetParameter <T>(string name, bool serverSide = false) { // If we don't have that parameter, make it if (!myParameters.ContainsKey(name)) { myParameters.Add(name, StateParameter.Construct <T>(name, (T)Activator.CreateInstance(typeof(T)), serverSide)); } // Get the parameter return(myParameters[name]); }
/// <summary> /// Private method used by all sets that handles setting a parameter /// </summary> /// <typeparam name="T">The type of the parameter to set</typeparam> /// <param name="name">The name of the parameter to set</param> /// <param name="value">The value to set</param> /// <param name="serverSide">True if this parameter should be NOT syncronized with peers</param> private void InternalSet <T>(string name, T value, bool serverSide) { // If the parameter does not exist, add it, otherwise update it if (!myParameters.ContainsKey(name)) { myParameters.Add(name, StateParameter.Construct(name, value, !serverSide)); } else { myParameters[name].SetValueInternal(value); } InvokeUpdated(myParameters[name]); }