internal static TDestination CreateLikenessProxy <TSource, TDestination>(TSource source, IEqualityComparer comparer, IEnumerable <MemberInfo> members) { ProxyType proxyType = ProxyGenerator.FindCompatibleConstructor <TDestination>(source, members.ToArray()); TypeBuilder builder = ProxyGenerator.BuildType <TDestination>(BuildModule(BuildAssembly(assemblyName))); FieldBuilder equals = ProxyGenerator.BuildFieldComparer(builder, comparer.GetType()); ProxyGenerator.BuildConstructors <TDestination>(proxyType.Constructor, builder, equals); ProxyGenerator.BuildMethodEquals(builder, BuildFieldEqualsHasBeenCalled(builder), equals); ProxyGenerator.BuildMethodGetHashCode <TDestination>(builder); var destination = (TDestination)Activator.CreateInstance( builder.CreateTypeInfo().AsType(), proxyType.Parameters.Concat(new[] { comparer }).ToArray()); ProxyGenerator.Map(source, destination); return(destination); }
internal static T CreateLikenessResemblance <T>(Likeness <T> likeness) { var members = typeof(T) .GetTypeInfo() .GetProperties(BindingFlags.Public | BindingFlags.Instance) .Concat(typeof(T) .GetTypeInfo() .GetFields(BindingFlags.Public | BindingFlags.Instance) .Cast <MemberInfo>()) .ToArray(); ProxyType proxyType = ProxyGenerator.FindCompatibleConstructor <T>( likeness.Value, members); TypeBuilder builder = ProxyGenerator.BuildType <T>( ProxyGenerator.BuildModule( ProxyGenerator.BuildAssembly(assemblyName))); FieldBuilder equals = ProxyGenerator.BuildFieldComparer(builder, likeness.GetType()); ProxyGenerator.BuildConstructors <T>( proxyType.Constructor, builder, equals); ProxyGenerator.BuildMethodEquals(builder, equals); ProxyGenerator.BuildMethodGetHashCode <T>(builder); return((T)Activator.CreateInstance( builder.CreateTypeInfo().AsType(), proxyType.Parameters.Concat( new[] { likeness }).ToArray())); }