public void Set2DimensionalParameter <D1, D2, T>(string componentName, string fieldName, ParameterValues parameters, string parameterName)
            where T : struct
            where D1 : IDimension
            where D2 : IDimension
        {
            var fieldKey = new Tuple <string, string>(componentName.ToLowerInvariant(), fieldName.ToLowerInvariant());

            if (!_dimensionalVariables.ContainsKey(fieldKey))
            {
                throw new InvalidOperationException();
            }

            var p = (ParameterValue2Dimensional <T>)parameters[parameterName.ToLowerInvariant()];

            if (typeof(D1) == typeof(Timestep) && typeof(D2).BaseType == typeof(System.Enum))
            {
                var value = new FieldParameter2DimensionalTime <D2, T>(this, p);

                _dimensionalVariables[fieldKey] = value;
            }
            else if (typeof(D1).BaseType == typeof(Enum) && typeof(D2).BaseType == typeof(Enum))
            {
                var value = new FieldParameter2Dimensional <D1, D2, T>(this, p);

                _dimensionalVariables[fieldKey] = value;
            }
            else
            {
                throw new ArgumentException("Unknown dimension type");
            }
        }
        public void LoadTwoDimensionalVariableFromParameters <D1, D2, T>(string componentName, string fieldName, ParameterValues parameters, string parameterName)
            where T : struct
            where D1 : IDimension
            where D2 : IDimension
        {
            var p = (ParameterValue2Dimensional <T>)parameters[parameterName.ToLowerInvariant()];

            if (typeof(D1) == typeof(Timestep) && typeof(IDimension).IsAssignableFrom(typeof(D2)))
            {
                var value = new FieldParameter2DimensionalTime <D2, T>(this, p);

                Add2DimensionalParameter <Timestep, D2, T>(componentName.ToLowerInvariant(), fieldName.ToLowerInvariant(), value);
            }
            else if (typeof(IDimension).IsAssignableFrom(typeof(D1)) && typeof(IDimension).IsAssignableFrom(typeof(D2)))
            {
                var value = new FieldParameter2Dimensional <D1, D2, T>(this, p);

                Add2DimensionalParameter <D1, D2, T>(componentName.ToLowerInvariant(), fieldName.ToLowerInvariant(), value);
            }
            else
            {
                throw new ArgumentException("Unknown dimension type");
            }
        }