- 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>
/// <returns>An instance of the given type</returns>
/// <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 genericResolveMethod = resolveMethod?.MakeGenericMethod(realType);
var genericResolveMethod = resolveMethod?.MakeGenericMethod(type);
if (genericResolveMethod == null)
throw new InternalResolveException($"Could not find function {nameof(ResolveInternal)}");
return genericResolveMethod.Invoke(this, new object[] {realArguments});
return genericResolveMethod.Invoke(this, new object[] {arguments});
}
/// <summary>

@ -46,6 +46,6 @@ namespace LightweightIocContainer.Interfaces
/// <param name="type">The given type</param>
/// <param name="arguments">The constructor arguments</param>
/// <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.Ldtoken, createMethod.ReturnType);
MethodInfo getTypeFromHandle = typeof(Type).GetMethod(nameof(Type.GetTypeFromHandle));
generator.EmitCall(OpCodes.Call, getTypeFromHandle, null);
if (args.Any())
{
generator.Emit(OpCodes.Ldc_I4_S, args.Length);
@ -119,7 +122,8 @@ namespace LightweightIocContainer.Registrations
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);
}

Loading…
Cancel
Save