public static Func <TArg, object> CreateConstructor <TArg>(this Type @this) { ConstructorInfo constructorInfo = @this.GetConstructor(typeof(TArg)); if (constructorInfo == null) { return(null); } ParameterExpression arg = Expression.Parameter(typeof(TArg)); return(Expression.Lambda <Func <TArg, object> >(Expression.New(constructorInfo, arg.Collect()), true, arg.Collect()).Compile()); }
private static Action <object, Delegate> CreateEventMethod(MethodInfo methodInfo) { ParameterExpression thisParameter = Expression.Parameter(typeof(object)); UnaryExpression convertThis = Expression.Convert(thisParameter, methodInfo.DeclaringType); ParameterExpression valueParamater = Expression.Parameter(typeof(Delegate)); UnaryExpression convertValue = Expression.Convert(valueParamater, methodInfo.GetParameters()[0].ParameterType); return(Expression.Lambda <Action <object, Delegate> >(Expression.Call(convertThis, methodInfo, Enumerable.Repeat(convertValue, 1)), false, thisParameter.Collect().AndThis(valueParamater)).Compile()); }
public static Func <object, TArg, TResult> GetInstanceFunctionFunction <TArg, TResult>(this Type @this, string functionName) { ParameterExpression thisParameter = Expression.Parameter(typeof(object)); ParameterExpression argParameter = Expression.Parameter(typeof(TArg)); MethodInfo[] methodInfos = @this.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo methodInfo = null; for (int i = 0; i < methodInfos.Length; i++, methodInfo = null) { methodInfo = methodInfos[i]; if (methodInfo.Name == functionName) { ParameterInfo[] parameterInfos = methodInfo.GetParameters(); if (parameterInfos.Length == 1 && parameterInfos[0].ParameterType.IsSameAs(typeof(TArg))) { break; } } } if (methodInfo == null) { return(null); } return(Expression.Lambda <Func <object, TArg, TResult> >(Expression.Call(Expression.Convert(thisParameter, @this), methodInfo, Enumerable.Repeat(argParameter, 1)), true, thisParameter.Collect().AndThis(argParameter)).Compile()); }