void SetTypedValue <T>(StyleValueHandleContext handle, T value)
        {
            switch (handle.handle.valueType)
            {
            case StyleValueType.Keyword:
                styleSheet.SetValue(handle.handle, (StyleValueKeyword)(object)value);
                break;

            case StyleValueType.Float:
                styleSheet.SetValue(handle.handle, (float)(object)value);
                break;

            case StyleValueType.Dimension:
                styleSheet.SetValue(handle.handle, (Dimension)(object)value);
                break;

            case StyleValueType.Color:
                styleSheet.SetValue(handle.handle, (Color)(object)value);
                break;

            case StyleValueType.ResourcePath:
                styleSheet.SetValue(handle.handle, (string)(object)value);
                break;

            case StyleValueType.AssetReference:
                styleSheet.SetValue(handle.handle, (UnityEngine.Object)(object) value);
                break;

            case StyleValueType.Enum:
                if (typeof(T).IsEnum || value is Enum)
                {
                    styleSheet.SetValue(handle.handle, (Enum)(object)value);
                }
                else if (typeof(T) == typeof(string) || value is string)
                {
                    styleSheet.SetValue(handle.handle, (string)(object)value);
                }
                break;

            case StyleValueType.String:
                styleSheet.SetValue(handle.handle, (string)(object)value);
                break;

            case StyleValueType.MissingAssetReference:
                styleSheet.SetValue(handle.handle, (string)(object)value);
                break;

            case StyleValueType.ScalableImage:
            // Not actually supported
            // styleSheet.SetValue(handle.handle, handle.AsScalableImage());
            // break;
            // These are not "values".
            case StyleValueType.Invalid:
            case StyleValueType.Variable:
            case StyleValueType.Function:
            case StyleValueType.CommaSeparator:
            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        StyleValueHandle TransferTypedValue(StyleValueHandleContext handle)
        {
            switch (handle.handle.valueType)
            {
            case StyleValueType.Keyword:
                return(AddTypedValue(handle.AsKeyword(), StyleValueType.Keyword));

            case StyleValueType.Float:
                return(AddTypedValue(handle.AsFloat(), StyleValueType.Float));

            case StyleValueType.Dimension:
                return(AddTypedValue(handle.AsDimension(), StyleValueType.Dimension));

            case StyleValueType.Color:
                return(AddTypedValue(handle.AsColor(), StyleValueType.Color));

            case StyleValueType.ResourcePath:
                return(AddTypedValue(handle.AsResourcePath(), StyleValueType.ResourcePath));

            case StyleValueType.AssetReference:
                return(AddTypedValue(handle.AsAssetReference(), StyleValueType.AssetReference));

            case StyleValueType.Enum:
                return(AddTypedValue(handle.AsEnum(), StyleValueType.Enum));

            case StyleValueType.String:
                return(AddTypedValue(handle.AsString(), StyleValueType.String));

            case StyleValueType.ScalableImage:
                return(AddTypedValue(handle.AsScalableImage(), StyleValueType.ScalableImage));

            case StyleValueType.MissingAssetReference:
                return(AddTypedValue(handle.AsString(), StyleValueType.MissingAssetReference));

            case StyleValueType.Invalid:
            case StyleValueType.Variable:
            case StyleValueType.Function:
            case StyleValueType.CommaSeparator:
            default:
                throw new ArgumentOutOfRangeException();
            }
        }