using System.Linq.Expressions; using System.Reflection; namespace ServerBase; public static class MethodInfoExtentions { public static TDelegate compile(MethodInfo mi) { ParameterExpression? @this = null; if (!mi.IsStatic) { @this = Expression.Parameter(mi.DeclaringType!, "this"); } var parameters = new List(); if (@this != null) { parameters.Add(@this); } foreach (var parameter in mi.GetParameters()) { parameters.Add(Expression.Parameter(parameter.ParameterType, parameter.Name)); } Expression? call = null; if (@this != null) { call = Expression.Call(@this, mi, parameters.Skip(1)); } else { call = Expression.Call(mi, parameters); } return Expression.Lambda(call, parameters).Compile(); } }