@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);
  • Вопрос задан
  • 156 просмотров
Пригласить эксперта
Ответы на вопрос 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();
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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