cechode Ответов: 3

обратное лямбда-выражение


Я пытаюсь найти способ исследовать выражение, переданное в функцию.

предполагая, что я сделаю этот звонок
DoIt( ()=>new Person().FirstName );


к
public static string DoIt<t> (Func<t> callme){
   return "what did callme point to";
}
</t></t>


Возможно ли, чтобы DoIt вернул "FirstName"? и если да, то не могли бы вы указать мне правильное направление, пожалуйста?

Большое спасибо.

wizardzz

Исправлена опечатка.

Sander Rossel

Вы действительно пропустили большую опечатку в теме!
http://en.wikipedia.org/wiki/Lambada :Д

wizardzz

Ха-ха, я, должно быть, думал об этом:
http://www.youtube.com/watch?v=PK2HANwsUWg

Sander Rossel

Возвращает воспоминания :)
Если Лабамба Тогда
SomeLameJokes
Конец, Если

cechode

LOL thx, не уверен, о чем я думал ( хех)
на самом деле я просто ужасный заклинатель :)
тнх

3 Ответов

Рейтинг:
2

Sergey Alexandrovich Kryukov

Извините, если я не совсем понимаю вашу идею, но вы обратили внимание на System.Delegate.GetInvocationList? Он точно отвечает на вопрос "что сделал callme указывает на". Однако это совсем не похоже на "обратную лямбду".

Может быть, вам нужно объяснить свою смутно выраженную идею в терминах того, чего вы хотите достичь, и какова будет конечная цель этого…

[РЕДАКТИРОВАТЬ]
Ответ на последующий вопрос/уточнение.
Речь идет о выражениях и деревьях выражений. Пожалуйста, смотрите http://msdn.microsoft.com/en-us/library/bb397951.aspx[^].

—СА


cechode

GetInvocationList не возвращает информацию desierd!
использование очень простое. Сделайте что-нибудь, основанное либо на имени последнего элемента в дереве, либо на значении атрибута ,который может существовать в этом элементе; ast. ( Имя в приведенном выше примере )

Sergey Alexandrovich Kryukov

Пожалуйста, ознакомьтесь с моим обновлением и нашей дискуссией с dasblinkenlight. Я думаю, все, что вы можете сделать, это работать в этом направлении.

Мой я спрашиваю вас, как вы видите свою конечную цель?

Чтобы дать вам представление: я разработал полноценную технологию для системы компьютерной алгебры. Последней и наиболее продвинутой реализацией был C#, и это было до деревьев выражений. Я сделал деревья выражений с нуля, что имеет серьезные преимущества (кроме совместимости с V.2.0: -). Я также могу работать как символическим, так и цифровым калькулятором.

Вы стремитесь развить что-то подобное?

--СА

Рейтинг:
1

Member 2862495

var actual0 = value.Aggregate(new StringBuilder(), (x, y) => x.Insert(0, y)).ToString();


CHill60

Каким образом это отвечает на вопрос 5-летней давности?

Рейтинг:
0

dasblinkenlight

Это сложная проблема - для этого вам нужен декомпилятор. Есть намек на решение[^] который вы можете использовать в качестве шаблона, но он включает в себя много кодирования.


Sergey Alexandrovich Kryukov

Я думаю, что речь идет только о деревьях выражений. Пожалуйста, смотрите мое обновление к моему ответу (после [EDIT]).
--СА

dasblinkenlight

Из его примера видно, что он не имеет дела с деревьями выражений, потому что он получает Func[t] в качестве аргумента.

Sergey Alexandrovich Kryukov

Я вижу. Тем не менее, я думаю, что намерение состоит в использовании дерева выражений.
--СА

dasblinkenlight

Да, это практически единственный вариант. Вопрос в том, как вы его получите, если все, что у вас есть, - это скомпилированная функция. Парень по моей ссылке предлагает декомпилироваться в дерево выражений. Было бы намного проще, если бы OP мог использовать вместо этого дерево выражений, потому что код мог бы как исследовать дерево, так и создавать исполняемое выражение, вызывая Compile().

Sergey Alexandrovich Kryukov

Думаю, вы правы.
--СА

cechode

вот это я называю хорошим днем !
спасибо вам, ребята, между путем выражения и путем ExpressionVisitor я сегодня многому научился!!!

( также узнал, что только потому, что вы можете, не означает, что вы должны :) )


спасибо еще раз всем .