diff --git a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Class.cs b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Class.cs index 5498e3c2b..0365f4900 100644 --- a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Class.cs +++ b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Class.cs @@ -155,7 +155,7 @@ namespace SerializationGenerator } } - source.GenerateSerializableProperty(fieldSymbol); + source.GenerateSerializableProperty(fieldSymbol, compilation); source.AppendLine(); var serializableProperty = SerializableMigrationRulesEngine.GenerateSerializableProperty( diff --git a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.MetadataTypes.cs b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.MetadataTypes.cs index 1068cd4fa..0c14aa308 100644 --- a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.MetadataTypes.cs +++ b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.MetadataTypes.cs @@ -26,6 +26,7 @@ namespace SerializationGenerator public const string IPADDRESS_CLASS = "System.Net.IPAddress"; public const string KEYVALUEPAIR_STRUCT = "System.Collections.Generic.KeyValuePair"; + public const string INVALIDATEPROPERTIES_ATTRIBUTE = "Server.InvalidatePropertiesAttribute"; public const string AFTERDESERIALIZATION_ATTRIBUTE = "Server.AfterDeserializationAttribute"; public const string SERIALIZABLE_ATTRIBUTE = "Server.SerializableAttribute"; public const string SERIALIZABLE_FIELD_ATTRIBUTE = "Server.SerializableFieldAttribute"; diff --git a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Property.cs b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Property.cs index 7699c4158..b2a648f35 100644 --- a/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Property.cs +++ b/Projects/SerializationGenerator/SerializableEntityGeneration/SerializableEntityGeneration.Property.cs @@ -13,6 +13,7 @@ * along with this program. If not, see . * *************************************************************************/ +using System.Linq; using System.Text; using Microsoft.CodeAnalysis; @@ -22,11 +23,22 @@ namespace SerializationGenerator { public static void GenerateSerializableProperty( this StringBuilder source, - IFieldSymbol fieldSymbol + IFieldSymbol fieldSymbol, + Compilation compilation ) { var fieldName = fieldSymbol.Name; + var invalidatePropertiesAttribute = fieldSymbol + .GetAttributes() + .OfType() + .FirstOrDefault( + attr => attr.AttributeClass?.Equals( + compilation.GetTypeByMetadataName(INVALIDATEPROPERTIES_ATTRIBUTE), + SymbolEqualityComparer.Default + ) ?? false + ); + source.GeneratePropertyStart(AccessModifier.Public, fieldSymbol); // Getter @@ -34,13 +46,17 @@ namespace SerializationGenerator // Setter source.GeneratePropertySetterStart(false); - source.AppendLine( - $@" if (value != {fieldName}) - {{ - ((ISerializable)this).MarkDirty(); - {fieldName} = value; - }}" - ); + const string indent = " "; + source.AppendLine($"{indent}if(value != {fieldName})"); + source.AppendLine($"{indent}{{"); + source.AppendLine($"{indent} {fieldName} = value;"); + source.AppendLine($"{indent} ((ISerializable)this).MarkDirty();"); + + if (invalidatePropertiesAttribute != null) + { + source.AppendLine($"{indent} InvalidateProperties();"); + } + source.AppendLine($"{indent}}}"); source.GeneratePropertyGetSetEnd(false); source.GeneratePropertyEnd(); diff --git a/Projects/Server/Serialization/InvalidatePropertiesAttribute.cs b/Projects/Server/Serialization/InvalidatePropertiesAttribute.cs new file mode 100644 index 000000000..b6f20f41e --- /dev/null +++ b/Projects/Server/Serialization/InvalidatePropertiesAttribute.cs @@ -0,0 +1,28 @@ +/************************************************************************* + * ModernUO * + * Copyright 2019-2021 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: InvalidatePropertiesAttribute.cs * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System; + +namespace Server +{ + /// + /// Hints to the source generator that this field will execute an InvalidateProperties when the value is set + /// and the value is different from the current value. + /// + [AttributeUsage(AttributeTargets.Field)] + public class InvalidatePropertiesAttribute : Attribute + { + } +}