#region License // Copyright (c) 2007 James Newton-King // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using LC.Newtonsoft.Json.Serialization; namespace LC.Newtonsoft.Json { /// /// Instructs the how to serialize the object. /// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public abstract class JsonContainerAttribute : Attribute { /// /// Gets or sets the id. /// /// The id. public string Id { get; set; } /// /// Gets or sets the title. /// /// The title. public string Title { get; set; } /// /// Gets or sets the description. /// /// The description. public string Description { get; set; } /// /// Gets or sets the collection's items converter. /// /// The collection's items converter. public Type ItemConverterType { get; set; } /// /// The parameter list to use when constructing the described by . /// If null, the default constructor is used. /// When non-null, there must be a constructor defined in the that exactly matches the number, /// order, and type of these parameters. /// /// /// /// [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] /// /// public object[] ItemConverterParameters { get; set; } /// /// Gets or sets the of the . /// /// The of the . public Type NamingStrategyType { get => _namingStrategyType; set { _namingStrategyType = value; NamingStrategyInstance = null; } } /// /// The parameter list to use when constructing the described by . /// If null, the default constructor is used. /// When non-null, there must be a constructor defined in the that exactly matches the number, /// order, and type of these parameters. /// /// /// /// [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] /// /// public object[] NamingStrategyParameters { get => _namingStrategyParameters; set { _namingStrategyParameters = value; NamingStrategyInstance = null; } } internal NamingStrategy NamingStrategyInstance { get; set; } // yuck. can't set nullable properties on an attribute in C# // have to use this approach to get an unset default state internal bool? _isReference; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; private Type _namingStrategyType; private object[] _namingStrategyParameters; /// /// Gets or sets a value that indicates whether to preserve object references. /// /// /// true to keep object reference; otherwise, false. The default is false. /// public bool IsReference { get => _isReference ?? default; set => _isReference = value; } /// /// Gets or sets a value that indicates whether to preserve collection's items references. /// /// /// true to keep collection's items object references; otherwise, false. The default is false. /// public bool ItemIsReference { get => _itemIsReference ?? default; set => _itemIsReference = value; } /// /// Gets or sets the reference loop handling used when serializing the collection's items. /// /// The reference loop handling. public ReferenceLoopHandling ItemReferenceLoopHandling { get => _itemReferenceLoopHandling ?? default; set => _itemReferenceLoopHandling = value; } /// /// Gets or sets the type name handling used when serializing the collection's items. /// /// The type name handling. public TypeNameHandling ItemTypeNameHandling { get => _itemTypeNameHandling ?? default; set => _itemTypeNameHandling = value; } /// /// Initializes a new instance of the class. /// protected JsonContainerAttribute() { } /// /// Initializes a new instance of the class with the specified container Id. /// /// The container Id. protected JsonContainerAttribute(string id) { Id = id; } } }