- fix IL code generation in TypedFactoryRegistration

- change signature of Resolve(Type, object[]) back to this correct one
pull/32/head
Simon Gockner 7 years ago
parent 42cc514bcc
commit c773fdc64d
  1. 20
      LightweightIocContainer/InjectorContainer.cs
  2. 2
      LightweightIocContainer/Interfaces/IInjectorContainer.cs
  3. 6
      LightweightIocContainer/Registrations/TypedFactoryRegistration.cs

@ -72,29 +72,15 @@ namespace LightweightIocContainer
/// <param name="arguments">The constructor arguments</param> /// <param name="arguments">The constructor arguments</param>
/// <returns>An instance of the given type</returns> /// <returns>An instance of the given type</returns>
/// <exception cref="InternalResolveException">Could not find function <see cref="ResolveInternal{T}"/></exception> /// <exception cref="InternalResolveException">Could not find function <see cref="ResolveInternal{T}"/></exception>
public object Resolve(object type, object arguments) //somehow the order of the arguments is different in the application compared to the unit test public object Resolve(Type type, object[] arguments) //somehow the order of the arguments is different in the application compared to the unit test
{ {
Type realType;
object[] realArguments;
if (type == null || type.GetType().IsArray)
{
realType = (Type) arguments;
realArguments = (object[]) type;
}
else
{
realType = (Type) type;
realArguments = (object[]) arguments;
}
var resolveMethod = typeof(InjectorContainer).GetMethod(nameof(ResolveInternal), BindingFlags.NonPublic | BindingFlags.Instance); var resolveMethod = typeof(InjectorContainer).GetMethod(nameof(ResolveInternal), BindingFlags.NonPublic | BindingFlags.Instance);
var genericResolveMethod = resolveMethod?.MakeGenericMethod(realType); var genericResolveMethod = resolveMethod?.MakeGenericMethod(type);
if (genericResolveMethod == null) if (genericResolveMethod == null)
throw new InternalResolveException($"Could not find function {nameof(ResolveInternal)}"); throw new InternalResolveException($"Could not find function {nameof(ResolveInternal)}");
return genericResolveMethod.Invoke(this, new object[] {realArguments}); return genericResolveMethod.Invoke(this, new object[] {arguments});
} }
/// <summary> /// <summary>

@ -46,6 +46,6 @@ namespace LightweightIocContainer.Interfaces
/// <param name="type">The given type</param> /// <param name="type">The given type</param>
/// <param name="arguments">The constructor arguments</param> /// <param name="arguments">The constructor arguments</param>
/// <returns>An instance of the given type</returns> /// <returns>An instance of the given type</returns>
object Resolve(object type, object arguments); object Resolve(Type type, object[] arguments);
} }
} }

@ -100,6 +100,9 @@ namespace LightweightIocContainer.Registrations
generator.Emit(OpCodes.Ldfld, containerFieldBuilder); generator.Emit(OpCodes.Ldfld, containerFieldBuilder);
generator.Emit(OpCodes.Ldtoken, createMethod.ReturnType); generator.Emit(OpCodes.Ldtoken, createMethod.ReturnType);
MethodInfo getTypeFromHandle = typeof(Type).GetMethod(nameof(Type.GetTypeFromHandle));
generator.EmitCall(OpCodes.Call, getTypeFromHandle, null);
if (args.Any()) if (args.Any())
{ {
generator.Emit(OpCodes.Ldc_I4_S, args.Length); generator.Emit(OpCodes.Ldc_I4_S, args.Length);
@ -119,7 +122,8 @@ namespace LightweightIocContainer.Registrations
generator.EmitCall(OpCodes.Call, emptyArray, null); generator.EmitCall(OpCodes.Call, emptyArray, null);
} }
generator.EmitCall(OpCodes.Callvirt, typeof(IInjectorContainer).GetMethod(nameof(IInjectorContainer.Resolve), new[] { typeof(object), typeof(object)}), null); generator.EmitCall(OpCodes.Callvirt, typeof(IInjectorContainer).GetMethod(nameof(IInjectorContainer.Resolve), new[] { typeof(Type), typeof(object[])}), null);
generator.Emit(OpCodes.Castclass, createMethod.ReturnType);
generator.Emit(OpCodes.Ret); generator.Emit(OpCodes.Ret);
} }

Loading…
Cancel
Save