in src/React.Core/TinyIoC/TinyIoC.cs [3829:3907]
private object GetLazyAutomaticFactoryRequest(Type type)
{
if (!type.IsGenericType())
return null;
Type genericType = type.GetGenericTypeDefinition();
//#if NETFX_CORE
// Type[] genericArguments = type.GetTypeInfo().GenericTypeArguments.ToArray();
//#else
Type[] genericArguments = type.GetGenericArguments();
//#endif
// Just a func
if (genericType == typeof(Func<>))
{
Type returnType = genericArguments[0];
//#if NETFX_CORE
// MethodInfo resolveMethod = typeof(TinyIoCContainer).GetTypeInfo().GetDeclaredMethods("Resolve").First(mi => !mi.GetParameters().Any());
//#else
MethodInfo resolveMethod = typeof(TinyIoCContainer).GetMethod("Resolve", new Type[] { });
//#endif
resolveMethod = resolveMethod.MakeGenericMethod(returnType);
var resolveCall = Expression.Call(Expression.Constant(this), resolveMethod);
var resolveLambda = Expression.Lambda(resolveCall).Compile();
return resolveLambda;
}
// 2 parameter func with string as first parameter (name)
if ((genericType == typeof(Func<,>)) && (genericArguments[0] == typeof(string)))
{
Type returnType = genericArguments[1];
//#if NETFX_CORE
// MethodInfo resolveMethod = typeof(TinyIoCContainer).GetTypeInfo().GetDeclaredMethods("Resolve").First(mi => mi.GetParameters().Length == 1 && mi.GetParameters()[0].GetType() == typeof(String));
//#else
MethodInfo resolveMethod = typeof(TinyIoCContainer).GetMethod("Resolve", new Type[] { typeof(String) });
//#endif
resolveMethod = resolveMethod.MakeGenericMethod(returnType);
ParameterExpression[] resolveParameters = new ParameterExpression[] { Expression.Parameter(typeof(String), "name") };
var resolveCall = Expression.Call(Expression.Constant(this), resolveMethod, resolveParameters);
var resolveLambda = Expression.Lambda(resolveCall, resolveParameters).Compile();
return resolveLambda;
}
// 3 parameter func with string as first parameter (name) and IDictionary<string, object> as second (parameters)
//#if NETFX_CORE
// if ((genericType == typeof(Func<,,>) && type.GenericTypeArguments[0] == typeof(string) && type.GenericTypeArguments[1] == typeof(IDictionary<string, object>)))
//#else
if ((genericType == typeof(Func<,,>) && type.GetGenericArguments()[0] == typeof(string) && type.GetGenericArguments()[1] == typeof(IDictionary<string, object>)))
//#endif
{
Type returnType = genericArguments[2];
var name = Expression.Parameter(typeof(string), "name");
var parameters = Expression.Parameter(typeof(IDictionary<string, object>), "parameters");
//#if NETFX_CORE
// MethodInfo resolveMethod = typeof(TinyIoCContainer).GetTypeInfo().GetDeclaredMethods("Resolve").First(mi => mi.GetParameters().Length == 2 && mi.GetParameters()[0].GetType() == typeof(String) && mi.GetParameters()[1].GetType() == typeof(NamedParameterOverloads));
//#else
MethodInfo resolveMethod = typeof(TinyIoCContainer).GetMethod("Resolve", new Type[] { typeof(String), typeof(NamedParameterOverloads) });
//#endif
resolveMethod = resolveMethod.MakeGenericMethod(returnType);
var resolveCall = Expression.Call(Expression.Constant(this), resolveMethod, name, Expression.Call(typeof(NamedParameterOverloads), "FromIDictionary", null, parameters));
var resolveLambda = Expression.Lambda(resolveCall, name, parameters).Compile();
return resolveLambda;
}
throw new TinyIoCResolutionException(type);
}