Задать вопрос
@youkerni
Unity3D developer

Как сравнить два лямбда выражения?

Суть вопроса: есть два идентичных события. Как сравнить их так, что бы метод AreEqual вернул True.

Action a = () => Debug.Log(true); 
Action b = () => Debug.Log(true);

var result = AreEqual(a, b);


Когда-то сравнивал через метод который в качестве шаблона принимал одну лямбду, а потом сравнивал их. Сигнатура примерно такая.

public bool AreEqual<T>(T template, object action)
{

}


Плюс нужно что бы это работало и в таком виде:
var result = AreEqual(()=> Debug.Log(true), b);
  • Вопрос задан
  • 161 просмотр
Подписаться 1 Средний 3 комментария
Помогут разобраться в теме Все курсы
  • OTUS
    C# Developer. Professional
    6 месяцев
    Далее
  • Ulearn.me
    Основы программирования на примере C#. Часть 1
    1 неделя
    Далее
  • Ulearn.me
    Основы программирования на примере C#. Часть 2
    1 неделя
    Далее
Пригласить эксперта
Ответы на вопрос 2
DarkRaven
@DarkRaven
разработка программного обеспечения
В теории, вы можете размотать данное выражение в какое-то строковое, по вашему правилу. Т.е., транслировать данное выражение, как транслируется LINQ в соответствующий SQL (с оговорками и сохранением информации по типам) - если грубо.
Но, я бы не рекомендовал так делать в принципе, т.к. это все издержки и профит не очевиден.
Ответ написан
Комментировать
@Csus4
Db4objects имеется в nuget
using System;
using System.Diagnostics;
using System.Linq.Expressions;

using Db4objects.Db4o.Linq.Expressions;

class Test
{

    static void Main()
    {
        Expression<Action> a = () => Debug.Write(1);
        Expression<Action> b = () => Debug.Write(1);
        Expression<Action> c = () => Debug.Write(2);
        Expression<Action> d = () => a.Compile();

        Func<Expression, Expression, bool> eq =
            ExpressionEqualityComparer.Instance.Equals;

        Console.WriteLine(eq(a, b));                                          //true
        Console.WriteLine(eq(a, c));                                          //false
        Console.WriteLine(eq(a, d));                                          //false 
        Console.WriteLine(eq(a, (Expression<Action>)(() => Debug.Write(1)))); //true
        Console.ReadKey();
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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