Отражение - Получает список вызовов метода в лямбда-выражении

Я уверен, что вы имели в виду std::find_if (который принимает предикат), а не std::find (который принимает значение ).

Также, исправляя ваше условное выражение в конце и добавляя соответствующий шаблон, мы получаем:

#include 
#include 
#include 
#include 

struct Car {};

int main()
{
    std::vector> cars;

    std::shared_ptr lambo = std::make_shared();
    std::weak_ptr wPtr(lambo);
    cars.emplace_back(lambo);

    const auto pos = std::find_if(cars.begin(), cars.end(), [&wPtr](const std::weak_ptr& ptr1) {
        return ptr1.lock() == wPtr.lock();
    });

    if (pos == cars.end())
        std::cout << "Not found!" << std::endl;
    else
        std::cout << "Found!" << std::endl;
}

// Output: Found!

( live demo )

5
задан Martin 4 April 2009 в 13:35
поделиться

5 ответов

Это довольно легко, пока Вы используете Expression<Action> вместо Action. Для полного кода, включая то, как подразумевать фактические значения, посмотрите здесь - в особенности ResolveMethod (и как это используется Invoke). Это - код, который я использую в protobuf-сети, чтобы сделать RPC на основе лямбд.

4
ответ дан 14 December 2019 в 04:48
поделиться


using System;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Linq.Expressions;

class Program {

static void Create(object o, int n) { Debug.Print("Create!"); }

static void LookAtThis(Expression<Action> expression)
{
    //inspect:
    MethodInfo method = ((MethodCallExpression)expression.Body).Method;
    Debug.Print("Method = '{0}'", method.Name);

    //execute:
    Action action = expression.Compile();
    action();
}

static void Main(string[] args)
{
    LookAtThis((Expression<Action>)(() => Create(null, 0)));
}

}

2
ответ дан 14 December 2019 в 04:48
поделиться

Я думаю, что необходимо было бы использовать Деревья выражений вместо этого. Посмотрите Дерево выражений Образец Visualizer и Как к: Реализуйте Посетителя Дерева выражений.

1
ответ дан 14 December 2019 в 04:48
поделиться
static MethodInfo GetMethodInfo<T>(Expression<Func<T>> expression)
{
    return ((MethodCallExpression)expression.Body).Method;
}
1
ответ дан 14 December 2019 в 04:48
поделиться

В сущности не это не возможно с отражением. Отражение, прежде всего, нацелено на предоставление информации о контроле метаданных во времени выполнения. То, что Вы просите, является фактической информацией об инспекции кода.

Я полагаю, что возможно получить фактические байты, представляющие IL для метода во времени выполнения. Однако это было бы просто что, массив байтов. Необходимо было бы вручную интерпретировать это в коды операций IL и использование, что для определения то, какие методы назвали. Это почти наверняка не, что Вы ищете все же.

Это возможно, хотя использовать лямбду дерева выражений и проанализировать это для вызовов метода. Однако это не может быть сделано ни на каком произвольном лямбда-выражении. Это должно быть сделано лямбда-выражение дерева выражений.

http://msdn.microsoft.com/en-us/library/bb397951.aspx

0
ответ дан 14 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: