コード例 #1
0
        private object SetValue([NotNull] MemberSetter setter, [CanBeNull] object obj, [CanBeNull] object value, [NotNull] Type serializedValueType)
        {
            var acceptedType = setter.GetValueType();

            if (ReferenceEquals(value, null))
            {
                if (acceptedType.IsValueType)
                {
                    throw new InvalidCastException("Cannot cast 'null' to a value type.");
                }
            }

            // Treat enum as inline, special case of integers
            if (acceptedType.IsEnum)
            {
                if (ReferenceEquals(value, null))
                {
                    throw new ApplicationException("Not possible.");
                }

                if (SerializingHelper.IsNumericType(serializedValueType))
                {
                    var enumValue = Enum.ToObject(acceptedType, value);

                    return(setter.SetValueDirect(obj, enumValue));
                }
            }

            var converterType  = setter.Attribute?.ConverterType;
            var convertedValue = Context.Converters.TryConvertTypeOfValue(serializedValueType, acceptedType, value, converterType);

            return(setter.SetValueDirect(obj, convertedValue));
        }
コード例 #2
0
        private MemberSetter FindSetterByName([NotNull] string serializedName, [CanBeNull] INamingConvention naming)
        {
            if (_createdSetters.ContainsKey(serializedName))
            {
                return(_createdSetters[serializedName]);
            }

            var properties = _properties;

            Debug.Assert(properties != null, nameof(properties) + " != null");

            var fields = _fields;

            Debug.Assert(fields != null, nameof(fields) + " != null");

            MemberSetter result = null;
            ScriptableObjectPropertyAttribute sopa;

            foreach (var prop in properties)
            {
                if (_propertyAttributeCache.ContainsKey(prop))
                {
                    sopa = _propertyAttributeCache[prop];
                }
                else
                {
                    sopa = prop.GetCustomAttribute <ScriptableObjectPropertyAttribute>();
                    _propertyAttributeCache[prop] = sopa;
                }

                var propName = GetCorrectedMemberName(sopa, naming, prop.Name);

                if (string.Equals(propName, serializedName, StringComparison.Ordinal))
                {
                    result = new MemberSetter(prop, sopa);
                    break;
                }
            }

            if (result == null)
            {
                foreach (var field in fields)
                {
                    if (_fieldAttributeCache.ContainsKey(field))
                    {
                        sopa = _fieldAttributeCache[field];
                    }
                    else
                    {
                        sopa = field.GetCustomAttribute <ScriptableObjectPropertyAttribute>();
                        _fieldAttributeCache[field] = sopa;
                    }

                    var fieldName = GetCorrectedMemberName(sopa, naming, field.Name);

                    if (string.Equals(fieldName, serializedName, StringComparison.Ordinal))
                    {
                        result = new MemberSetter(field, sopa);
                        break;
                    }
                }
            }

            if (result == null)
            {
                result = MemberSetter.Null;
            }

            _createdSetters[serializedName] = result;

            return(result);
        }