generated/runtime/Models/JsonMember.cs

/*---------------------------------------------------------------------------------------------
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
using System;
using System.Reflection;
using System.Runtime.Serialization;
 
namespace Commvault.Powershell.Runtime.Json
{
     
 
    internal sealed class JsonMember
    {
        private readonly TypeDetails type;
 
        private readonly Func<object, object> getter;
        private readonly Action<object, object> setter;
 
        internal JsonMember(PropertyInfo property, int defaultOrder)
        {
            getter = property.GetValue;
            setter = property.SetValue;
 
            var dataMember = property.GetCustomAttribute<DataMemberAttribute>();
 
            Name = dataMember?.Name ?? property.Name;
            Order = dataMember?.Order ?? defaultOrder;
            EmitDefaultValue = dataMember?.EmitDefaultValue ?? true;
 
            this.type = TypeDetails.Get(property.PropertyType);
 
            CanRead = property.CanRead;
        }
 
        internal JsonMember(FieldInfo field, int defaultOrder)
        {
            getter = field.GetValue;
            setter = field.SetValue;
 
            var dataMember = field.GetCustomAttribute<DataMemberAttribute>();
 
            Name = dataMember?.Name ?? field.Name;
            Order = dataMember?.Order ?? defaultOrder;
            EmitDefaultValue = dataMember?.EmitDefaultValue ?? true;
 
            this.type = TypeDetails.Get(field.FieldType);
 
            CanRead = true;
        }
 
        internal string Name { get; }
 
        internal int Order { get; }
 
        internal TypeDetails TypeDetails => type;
 
        internal Type Type => type.NonNullType;
 
        internal bool IsList => type.IsList;
 
        // Arrays, Sets, ...
        internal Type ElementType => type.ElementType;
 
        internal IJsonConverter Converter => type.JsonConverter;
 
        internal bool EmitDefaultValue { get; }
 
        internal bool IsStringLike => type.IsStringLike;
 
        internal object DefaultValue => type.DefaultValue;
 
        internal bool CanRead { get; }
 
        #region Helpers
 
        internal object GetValue(object instance) => getter(instance);
 
        internal void SetValue(object instance, object value) => setter(instance, value);
 
        #endregion
    }
}