diff --git a/sdk/src/Services/DynamoDBv2/Custom/Conversion/DynamoDBEntryConversion.cs b/sdk/src/Services/DynamoDBv2/Custom/Conversion/DynamoDBEntryConversion.cs index 62e677843ca6..eb7095962daf 100644 --- a/sdk/src/Services/DynamoDBv2/Custom/Conversion/DynamoDBEntryConversion.cs +++ b/sdk/src/Services/DynamoDBv2/Custom/Conversion/DynamoDBEntryConversion.cs @@ -384,54 +384,59 @@ internal PrimitiveList ItemsToPrimitiveList(IEnumerable items) private ConverterCache ConverterCache = new ConverterCache(); private ConversionSchema OriginalConversion; - private void AddConverters(string suffix) - { - var typedConverterType = typeof(Converter); - var assembly = typeof(DynamoDBEntryConversion).Assembly; - - var allTypes = assembly.GetTypes(); - - foreach (var type in allTypes) - { - string fullName = type.FullName; - - //if (type.Namespace != typedConverterType.Namespace) - // continue; - - if (type.IsAbstract) - continue; - - if (!type.Name.EndsWith(suffix, StringComparison.Ordinal)) - continue; - - if (!typedConverterType.IsAssignableFrom(type)) - continue; - - AddConverter(type); - } - } internal void AddConverter(Converter converter) { ConverterCache.AddConverter(converter, this); } -#if NET8_0_OR_GREATER - internal void AddConverter([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type type) -#else - internal void AddConverter(Type type) -#endif - { - var converter = Activator.CreateInstance(type) as Converter; - AddConverter(converter); - } - private void SetV1Converters() { - AddConverters("ConverterV1"); + AddConverter(new ByteConverterV1()); + AddConverter(new SByteConverterV1()); + AddConverter(new UInt16ConverterV1()); + AddConverter(new Int16ConverterV1()); + AddConverter(new UInt32ConverterV1()); + AddConverter(new Int32ConverterV1()); + AddConverter(new UInt64ConverterV1()); + AddConverter(new Int64ConverterV1()); + AddConverter(new SingleConverterV1()); + AddConverter(new DoubleConverterV1()); + AddConverter(new DecimalConverterV1()); + AddConverter(new CharConverterV1()); + AddConverter(new StringConverterV1()); + AddConverter(new DateTimeConverterV1()); + AddConverter(new GuidConverterV1()); + AddConverter(new BytesConverterV1()); + AddConverter(new MemoryStreamConverterV1()); + AddConverter(new EnumConverterV1()); + AddConverter(new BoolConverterV1()); + AddConverter(new PrimitiveCollectionConverterV1()); + AddConverter(new DictionaryConverterV1()); } + private void SetV2Converters() { - AddConverters("ConverterV2"); + AddConverter(new ByteConverterV2()); + AddConverter(new SByteConverterV2()); + AddConverter(new UInt16ConverterV2()); + AddConverter(new Int16ConverterV2()); + AddConverter(new UInt32ConverterV2()); + AddConverter(new Int32ConverterV2()); + AddConverter(new UInt64ConverterV2()); + AddConverter(new Int64ConverterV2()); + AddConverter(new SingleConverterV2()); + AddConverter(new DoubleConverterV2()); + AddConverter(new DecimalConverterV2()); + AddConverter(new CharConverterV2()); + AddConverter(new StringConverterV2()); + AddConverter(new DateTimeConverterV2()); + AddConverter(new GuidConverterV2()); + AddConverter(new BytesConverterV2()); + AddConverter(new MemoryStreamConverterV2()); + AddConverter(new DictionaryConverterV2()); + AddConverter(new EnumConverterV2()); + AddConverter(new BoolConverterV2()); + AddConverter(new CollectionConverterV2()); } // Converts items to Primitives. @@ -460,7 +465,7 @@ private IEnumerable ToPrimitives(IEnumerable items, Type elementType) } } -#endregion + #endregion } internal abstract class Converter diff --git a/sdk/test/Services/DynamoDBv2/UnitTests/Custom/DynamoDBEntryConversionTests.cs b/sdk/test/Services/DynamoDBv2/UnitTests/Custom/DynamoDBEntryConversionTests.cs new file mode 100644 index 000000000000..82b9af68e070 --- /dev/null +++ b/sdk/test/Services/DynamoDBv2/UnitTests/Custom/DynamoDBEntryConversionTests.cs @@ -0,0 +1,71 @@ +using Amazon.DynamoDBv2; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace AWSSDK_DotNet35.UnitTests +{ + [TestClass] + public class DynamoDBEntryConversionTests + { + [TestMethod] + public void ValidateAllConvertersAreRegisteredForConversionV1() + { + AssertAllConvertersAreRegistered(DynamoDBEntryConversion.V1, "ConverterV1"); + } + + [TestMethod] + public void ValidateAllConvertersAreRegisteredForConversionV2() + { + AssertAllConvertersAreRegistered(DynamoDBEntryConversion.V2, "ConverterV2"); + } + + private void AssertAllConvertersAreRegistered(DynamoDBEntryConversion conversion, string suffix) + { + var converters = GetConverters(suffix); + + var tryGetConverterInfo = conversion.GetType().GetMethod("TryGetConverter", BindingFlags.NonPublic | BindingFlags.Instance); + + foreach (var converter in converters) + { + var getTargetTypeInfo = converter.GetType().GetMethod("GetTargetTypes"); + IEnumerable targetTypes = (IEnumerable)getTargetTypeInfo.Invoke(converter, new object[0]); + foreach (var type in targetTypes) + { + var tryGetConverterParams = new object[] { type, null }; + tryGetConverterInfo.Invoke(conversion, tryGetConverterParams); + var registeredConverter = tryGetConverterParams[1]; + + Assert.IsNotNull(registeredConverter); + Assert.AreEqual(converter.GetType(), registeredConverter.GetType()); + } + } + } + + private IEnumerable GetConverters(string suffix) + { + const string converterTypeName = "Amazon.DynamoDBv2.Converter"; + var assembly = typeof(DynamoDBEntryConversion).Assembly; + + var allTypes = assembly.GetTypes(); + var typedConverterType = allTypes.FirstOrDefault(x => string.Equals(converterTypeName, x.FullName)); + + foreach (var type in allTypes) + { + if (type.IsAbstract) + continue; + + if (!type.Name.EndsWith(suffix, StringComparison.Ordinal)) + continue; + + if (!typedConverterType.IsAssignableFrom(type)) + continue; + + var constructor = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, new Type[0], null); + yield return constructor.Invoke(new object[0]); + } + } + } +} \ No newline at end of file