using Flee.PublicTypes; namespace Flee.InternalTypes { internal interface IVariable { IVariable Clone(); Type VariableType { get; } object ValueAsObject { get; set; } } internal interface IGenericVariable { object GetValue(); } internal class DynamicExpressionVariable : IVariable, IGenericVariable { private IDynamicExpression _myExpression; public IVariable Clone() { DynamicExpressionVariable copy = new DynamicExpressionVariable(); copy._myExpression = _myExpression; return copy; } public object GetValue() { return (T)_myExpression.Evaluate(); } public object ValueAsObject { get { return _myExpression; } set { _myExpression = value as IDynamicExpression; } } public System.Type VariableType => _myExpression.Context.Options.ResultType; } internal class GenericExpressionVariable : IVariable, IGenericVariable { private IGenericExpression _myExpression; public IVariable Clone() { GenericExpressionVariable copy = new GenericExpressionVariable(); copy._myExpression = _myExpression; return copy; } public object GetValue() { return _myExpression.Evaluate(); } public object ValueAsObject { get { return _myExpression; } set { _myExpression = (IGenericExpression)value; } } public System.Type VariableType => _myExpression.Context.Options.ResultType; } internal class GenericVariable : IVariable, IGenericVariable { public object MyValue; public IVariable Clone() { GenericVariable copy = new GenericVariable { MyValue = MyValue }; return copy; } public object GetValue() { return MyValue; } public System.Type VariableType => typeof(T); public object ValueAsObject { get { return MyValue; } set { if (value == null) { MyValue = default(T); } else { MyValue = value; } } } } }