object instantiateByReflectionConstructor(ILifetimeScope lifetimeScope, Type t) { var constructors = t.GetConstructors(); if (constructors.Length == 0) { throw new ResolveException("failed to instantiate type {0}: no public constructor", t); } var constructor = selectPreferredConstructor(constructors); var parameters = constructor.GetParameters(); var resolvedObjects = new object[parameters.Length]; foreach (var p in parameters.indices()) { var obj = lifetimeScope.resolve(parameters[p].ParameterType); resolvedObjects[p] = obj; } var instance = constructor.Invoke(resolvedObjects); lifetimeScope.Debug("inst {2,8:X}: {0} => {1}".fmt(t.Name, instance, (uint)instance.GetHashCode())); return(instance); }
static object callStaticMethod(ILifetimeScope lifetimeScope, MethodInfo concreteMethod) { Debug.Assert(!concreteMethod.IsGenericMethodDefinition); Debug.Assert(concreteMethod.IsStatic); var parameters = concreteMethod.GetParameters(); var arguments = new object[parameters.Length]; foreach (var p in parameters.indices()) arguments[p] = lifetimeScope.resolve(parameters[p].ParameterType); return concreteMethod.Invoke(null, arguments); }
static object callStaticMethod(ILifetimeScope lifetimeScope, MethodInfo concreteMethod) { Debug.Assert(!concreteMethod.IsGenericMethodDefinition); Debug.Assert(concreteMethod.IsStatic); var parameters = concreteMethod.GetParameters(); var arguments = new object[parameters.Length]; foreach (var p in parameters.indices()) { arguments[p] = lifetimeScope.resolve(parameters[p].ParameterType); } return(concreteMethod.Invoke(null, arguments)); }
object buildFromGenericInterface(ILifetimeScope lifetimeScope, Type genericInterface) { Debug.Assert(genericInterface.IsInterface && genericInterface.IsGenericType && !genericInterface.IsGenericTypeDefinition); var def = genericInterface.GetGenericTypeDefinition(); var implementation = tryGetImplementationForInterface(def); if (implementation == null) { return(buildFromGenericByUsingAGenerator(lifetimeScope, genericInterface)); } Debug.Assert(implementation.GetGenericArguments().Length == genericInterface.GetGenericArguments().Length); var implementationType = implementation.MakeGenericType(genericInterface.GetGenericArguments()); return(lifetimeScope.resolve(implementationType)); }
object buildFromInterface(ILifetimeScope lifetimeScope, Type t) { Debug.Assert(t.IsInterface); var implementation = tryGetImplementationForInterface(t); if (implementation != null) { return(lifetimeScope.resolve(implementation)); } if (t.IsGenericType) { return(buildFromGenericInterface(lifetimeScope, t)); } throw new ResolveException("failed to resolve type {0}: failed to resolve interface", t); }
object instantiateByReflectionConstructor(ILifetimeScope lifetimeScope, Type t) { var constructors = t.GetConstructors(); if (constructors.Length == 0) throw new ResolveException("failed to instantiate type {0}: no public constructor", t); var constructor = selectPreferredConstructor(constructors); var parameters = constructor.GetParameters(); var resolvedObjects = new object[parameters.Length]; foreach (var p in parameters.indices()) { var obj = lifetimeScope.resolve(parameters[p].ParameterType); resolvedObjects[p] = obj; } var instance = constructor.Invoke(resolvedObjects); lifetimeScope.Debug("inst {2,8:X}: {0} => {1}".fmt(t.Name, instance, (uint)instance.GetHashCode())); return instance; }
public static T resolve <T>(this ILifetimeScope lifetimeScope) { return((T)lifetimeScope.resolve(typeof(T))); }
object buildFromInterface(ILifetimeScope lifetimeScope, Type t) { Debug.Assert(t.IsInterface); var implementation = tryGetImplementationForInterface(t); if (implementation != null) return lifetimeScope.resolve(implementation); if (t.IsGenericType) return buildFromGenericInterface(lifetimeScope, t); throw new ResolveException("failed to resolve type {0}: failed to resolve interface", t); }
object buildFromGenericInterface(ILifetimeScope lifetimeScope, Type genericInterface) { Debug.Assert(genericInterface.IsInterface && genericInterface.IsGenericType && !genericInterface.IsGenericTypeDefinition); var def = genericInterface.GetGenericTypeDefinition(); var implementation = tryGetImplementationForInterface(def); if (implementation == null) return buildFromGenericByUsingAGenerator(lifetimeScope, genericInterface); Debug.Assert(implementation.GetGenericArguments().Length == genericInterface.GetGenericArguments().Length); var implementationType = implementation.MakeGenericType(genericInterface.GetGenericArguments()); return lifetimeScope.resolve(implementationType); }