private bool TryGetOwnValue <T>(FieldKey key, Entity context, out T value) { if (OwnValues != null) { object @objectValue; if (OwnValues.TryGetValue(key, out @objectValue)) { if (objectValue is T tValue) { value = tValue; return(true); } else { var producer = objectValue as IValueProducer <T>; if (producer != null) { value = producer.Produce(context); return(true); } else { try { value = (T)Convert.ChangeType(objectValue, typeof(T)); return(true); } catch { var format = "Unexpected field type. Expect {0}, got {1}"; var message = String.Format(format, typeof(T).Name, objectValue.GetType().Name); throw new Exception(message); } } } } } value = default(T); return(false); }
public void Merge(FieldList other) { var fieldKey = SystemField.DeletedKeys.ToFieldKey(); if (other.TryGetValue(fieldKey, out object value)) { var deletedKeys = value as List <FieldKey>; if (deletedKeys != null) { foreach (var key in deletedKeys) { this.Remove(key); } } other.Remove(fieldKey); } foreach (var pair in other) { this[pair.Key] = pair.Value; } }