Динамические перегрузки linq и оператора - PullRequest
10 голосов
/ 12 января 2012

Рассмотрим код ниже:

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 не было обработано кодом пользователя Сообщение = Оператор'+' несовместим с типами операндов 'Vector2' и 'Vector2'. Source = DynamicLINQ Position = 6

Как заставить синтаксический анализатор «видеть» перегрузку оператора + на Vector2type?

РЕДАКТИРОВАТЬ: я также получаю ту же проблему с оператором =.
Глядя на источник, я вижу, почему, он смотрит на специальный интерфейс, который перечисляет множество методов, для простых типови если он не может его найти, то возникает исключение.Проблема в том, что моего типа (Vector2) нет в этом списке, поэтому он никогда не найдет методы оператора.

1 Ответ

2 голосов
/ 12 января 2012

Работая с библиотекой 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);
}
...