Подтвердить что ты не робот

Динамические перегрузки linq и оператора

Рассмотрим приведенный ниже код:

var vectorTest = new Vector2(1, 2) + new Vector2(3, 4); // Works

var x = Expression.Parameter(typeof(Vector2), "x");
var test = System.Linq.Dynamic
                 .DynamicExpression.ParseLambda(new[] { x }, null, "x = x + x");

Запустив это, я получаю исключение ниже:

System.Linq.Dynamic.ParseException не был обработан кодом пользователя   Message = Operator '+' несовместим с типами операндов "Vector2" и "Vector2"   Источник = DynamicLINQ   Позиция = 6

Как заставить анализатор "видеть" перегрузку оператора + в типе Vector2?

EDIT: Я также получаю ту же проблему с оператором =.
Глядя на источник, я вижу, почему, он смотрит на специальный интерфейс, в котором перечислены множество методов, для простых типов и если он не может его найти, тогда возникает исключение. Проблема в том, что мой тип (Vector2) отсутствует в этом списке, поэтому он никогда не найдет методы оператора.

4b9b3361

Ответ 1

Работая с библиотекой DynamicLinq, вам нужно добавить подпись к одному из интерфейсов подписи, найденному в System.Linq.Dynamic.ExpressionParser. Он будет анализировать только те операции, которые он распознает.

Кажется, он посмотрит на все частные интерфейсы, найденные в ExpressionParser. Просто добавьте интерфейс в ExpressionParser и, похоже, подавите ошибку.

interface ICustomSignatures
{
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y);
}

Чтобы быть в безопасности (и, возможно, соответствовать намеченному шаблону), было бы безопаснее добавлять/расширять интерфейс IAddSignatures.

interface ICustomSignatures : IAddSignatures
{
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y);
}