Как получить тело метода (его исходный код/ExpresionTree) в рантайме
У Вас есть инстанс типа, содержащего искомый метод, соответственно есть и его 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'
Источник: Stack Overflow на русском