using System; using System.Linq.Expressions; using System.Reflection; namespace ProjectZ.Base { public class ObjActivator { public delegate T ObjectActivator(params object[] args); public static ObjectActivator GetActivator(ConstructorInfo ctor) { var paramsInfo = ctor.GetParameters(); //create a single param of type object[] var param = Expression.Parameter(typeof(object[]), "args"); var argsExp = new Expression[paramsInfo.Length]; //pick each arg from the params array //and create a typed expression of them for (var i = 0; i < paramsInfo.Length; i++) { Expression index = Expression.Constant(i); Type paramType = paramsInfo[i].ParameterType; Expression paramAccessorExp = Expression.ArrayIndex(param, index); Expression paramCastExp = Expression.Convert(paramAccessorExp, paramType); argsExp[i] = paramCastExp; } //make a NewExpression that calls the //ctor with the args we just created var newExp = Expression.New(ctor, argsExp); //create a lambda with the New //Expression as body and our param object[] as arg var lambda = Expression.Lambda(typeof(ObjectActivator), newExp, param); //compile it ObjectActivator compiled = (ObjectActivator)lambda.Compile(); return compiled; } } }