Как получить тело метода (его исходный код/ExpresionTree) в рантайме

Рейтинг: 0Ответов: 0Опубликовано: 20.01.2023

У Вас есть инстанс типа, содержащего искомый метод, соответственно есть и его MethodInfo.

В искомом тексте метода хочется найти все обращения к одному из его параметров и сложить в массив (можно прямо в текстовом виде). Например:

        public interface ISomeInterface
        {
            int Item { get; set; }
        }

...

        // Далее внутри имплементации сервиса, обрабатывающего ISomeInterface, есть искомый метод:
        public int SomeMethod<TParam>(TParam parameter)
            where TParam : ISomeInterface
        {
            if (parameter.Item > 0)
            {
                return parameter.Item;
            }

            return parameter.Item + 1;
        }

У меня есть инстанс объекта, содержащего метод SomeMethod. Что я делаю:

        /// <summary>
        /// Получение данных
        /// </summary>
        /// <param name="entities">данные</param>
        /// <typeparam name="TEntity">Тип элемента</typeparam>
        public static string[] GetData<TEntity>(this ISomeInterfaceService<TEntity> provider)
            where TEntity : class, ISomeInterface
        {
            var type = provider.GetType();
            var getIdInternalMethodInfo = type.GetMethod(
                "SomeMethod",
                BindingFlags.Instance | BindingFlags.NonPublic);
            var parameterName = getIdInternalMethodInfo.GetParameters()[0];
            var methodBody = getIdInternalMethodInfo.GetMethodBody();

            // И дальше проблемы...
            // methodBody.GetILAsByteArray()
            
            return new[] { "" };
        }

Я получил MethodInfo, получил искомый параметр. Но как мне получить обращения к нему?

P.S. Не смог создать метку 'expressiontree'

Ответы

Ответов пока нет.