public virtual void RegisterDelegateFactoryForType<TResult, TFactoryDelegateType>() { MethodInfo delegateInvoker = typeof(TFactoryDelegateType).GetMethod("Invoke"); ParameterExpression[] factoryParams = GetParamsAsExpressions(delegateInvoker); //Build the factory from the template MethodInfo mi = typeof(ClassFactory).GetMethod("FactoryTemplate"); mi = mi.MakeGenericMethod(typeof(TResult)); Expression call = Expression.Call(mi, new Expression[] {Expression.Constant(this), Expression.NewArrayInit(typeof(Object), factoryParams)}); TFactoryDelegateType factory = Expression.Lambda<TFactoryDelegateType>(call, factoryParams).Compile(); _ClassFactory.AddFactory(typeof(TFactoryDelegateType), factory as Delegate)); }