Динамические перегрузки 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
) отсутствует в этом списке, поэтому он никогда не найдет методы оператора.
Ответы
Ответ 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);
}