From 7d2de9ad2433952129211455e9a3cbcdb2bd3814 Mon Sep 17 00:00:00 2001 From: 7H3LaughingMan <7H3LaughingMan@proton.me> Date: Sat, 26 Apr 2025 20:05:05 -0500 Subject: [PATCH] RequiresUnreferencedCode & RequiresDynamicCode on anything using reflection --- .../CustomTypes/CustomClassDefinition.cs | 11 +++++++++++ .../CustomTypes/CustomEnumDefinition.cs | 5 +++++ src/DotTiled/Properties/IHasProperties.cs | 19 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/src/DotTiled/Properties/CustomTypes/CustomClassDefinition.cs b/src/DotTiled/Properties/CustomTypes/CustomClassDefinition.cs index 7d799ca..6fe1dd4 100644 --- a/src/DotTiled/Properties/CustomTypes/CustomClassDefinition.cs +++ b/src/DotTiled/Properties/CustomTypes/CustomClassDefinition.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; @@ -104,6 +105,8 @@ public class CustomClassDefinition : HasPropertiesBase, ICustomTypeDefinition /// The type of the class to create a custom class definition from. /// A new instance. /// Thrown when the specified type is not a class. + [RequiresUnreferencedCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] + [RequiresDynamicCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] public static CustomClassDefinition FromClass(Type type) { ArgumentNullException.ThrowIfNull(type, nameof(type)); @@ -127,6 +130,8 @@ public class CustomClassDefinition : HasPropertiesBase, ICustomTypeDefinition /// /// The type of the class to create a custom class definition from. /// A new instance. + [RequiresUnreferencedCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] + [RequiresDynamicCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] public static CustomClassDefinition FromClass() where T : class, new() => FromClass(() => new T()); /// @@ -135,6 +140,8 @@ public class CustomClassDefinition : HasPropertiesBase, ICustomTypeDefinition /// The type of the class to create a custom class definition from. /// The factory function that creates an instance of the class. /// A new instance. + [RequiresUnreferencedCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] + [RequiresDynamicCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] public static CustomClassDefinition FromClass(Func factory) where T : class { var instance = factory(); @@ -149,6 +156,8 @@ public class CustomClassDefinition : HasPropertiesBase, ICustomTypeDefinition }; } + [RequiresUnreferencedCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] + [RequiresDynamicCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] private static IProperty ConvertPropertyInfoToIProperty(object instance, PropertyInfo propertyInfo) { switch (propertyInfo.PropertyType) @@ -183,6 +192,8 @@ public class CustomClassDefinition : HasPropertiesBase, ICustomTypeDefinition throw new NotSupportedException($"Type '{propertyInfo.PropertyType.Name}' is not supported in custom classes."); } + [RequiresUnreferencedCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] + [RequiresDynamicCode("Use manually defined class properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#class-properties")] private static List GetNestedProperties(Type type, object instance) { var defaultInstance = Activator.CreateInstance(type); diff --git a/src/DotTiled/Properties/CustomTypes/CustomEnumDefinition.cs b/src/DotTiled/Properties/CustomTypes/CustomEnumDefinition.cs index b0d6e88..0c52512 100644 --- a/src/DotTiled/Properties/CustomTypes/CustomEnumDefinition.cs +++ b/src/DotTiled/Properties/CustomTypes/CustomEnumDefinition.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; namespace DotTiled; @@ -53,6 +54,8 @@ public class CustomEnumDefinition : ICustomTypeDefinition /// /// The storage type of the custom enum. Defaults to to be consistent with Tiled. /// + [RequiresUnreferencedCode("Use manually defined enum properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#enum-properties")] + [RequiresDynamicCode("Use manually defined enum properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#enum-properties")] public static CustomEnumDefinition FromEnum(CustomEnumStorageType storageType = CustomEnumStorageType.String) where T : Enum { var type = typeof(T); @@ -73,6 +76,8 @@ public class CustomEnumDefinition : ICustomTypeDefinition /// The enum type to create a custom enum definition from. /// The storage type of the custom enum. Defaults to to be consistent with Tiled. /// + [RequiresUnreferencedCode("Use manually defined enum properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#enum-properties")] + [RequiresDynamicCode("Use manually defined enum properties.", Url = "https://dcronqvist.github.io/DotTiled/docs/essentials/custom-properties.html#enum-properties")] public static CustomEnumDefinition FromEnum(Type type, CustomEnumStorageType storageType = CustomEnumStorageType.String) { if (!type.IsEnum) diff --git a/src/DotTiled/Properties/IHasProperties.cs b/src/DotTiled/Properties/IHasProperties.cs index 6dd1798..668a91a 100644 --- a/src/DotTiled/Properties/IHasProperties.cs +++ b/src/DotTiled/Properties/IHasProperties.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; namespace DotTiled; @@ -36,6 +37,7 @@ public interface IHasProperties /// /// /// + [RequiresUnreferencedCode("Use 'MapPropertiesTo' with a custom mapper instead.")] T MapPropertiesTo() where T : new(); /// @@ -44,7 +46,16 @@ public interface IHasProperties /// /// /// + [RequiresUnreferencedCode("Use 'MapPropertiesTo' with a custom mapper instead.")] T MapPropertiesTo(Func initializer); + + /// + /// Maps all properties in this object to a new instance of the specified type using the provided mapper. + /// + /// + /// + /// + T MapPropertiesTo(Func, T> mapper); } /// @@ -85,11 +96,17 @@ public abstract class HasPropertiesBase : IHasProperties } /// + [RequiresUnreferencedCode("Use 'MapPropertiesTo' with a custom mapper instead.")] public T MapPropertiesTo() where T : new() => CreateMappedInstance(GetProperties()); /// + [RequiresUnreferencedCode("Use 'MapPropertiesTo' with a custom mapper instead.")] public T MapPropertiesTo(Func initializer) => CreateMappedInstance(GetProperties(), initializer); + /// + public T MapPropertiesTo(Func, T> mapper) => mapper(GetProperties()); + + [RequiresUnreferencedCode("Use 'MapPropertiesTo' with a custom mapper instead.")] private static object CreatedMappedInstance(object instance, IList properties) { var type = instance.GetType(); @@ -141,8 +158,10 @@ public abstract class HasPropertiesBase : IHasProperties return instance; } + [RequiresUnreferencedCode("Use 'MapPropertiesTo' with a custom mapper instead.")] private static T CreateMappedInstance(IList properties) where T : new() => (T)CreatedMappedInstance(Activator.CreateInstance() ?? throw new InvalidOperationException($"Failed to create instance of '{typeof(T).Name}'."), properties); + [RequiresUnreferencedCode("Use 'MapPropertiesTo' with a custom mapper instead.")] private static T CreateMappedInstance(IList properties, Func initializer) => (T)CreatedMappedInstance(initializer(), properties); }