Возможно ли в вашем тесте, что свойство Shipment не было инициализировано в вашем контейнере?
Пара других рекомендаций: если вы должны использовать выражения, рассмотрите возможность кэширования скомпилированной версии выражения, чтобы оно моглоиспользовать повторно, а не перекомпилировать его каждый раз, когда вы захотите его использовать.
Во-вторых, есть ли конкретная причина, по которой вы решили использовать выражения, а не просто использовать Func в своем правиле?Обычно при создании таких механизмов правил мой класс правил определяется следующим образом:
public class Rule
{
public string Description {get; set;}
public Func<T, bool> RuleToApply {get; set;}
}
Учитывая это, я создаю свою коллекцию правил следующим образом:
var rules = new List<Rule>() {
new Rule { Description = "OrderNumber Contains 55",
RuleToApply = order => order.OrderNumber.Contains("55") }
};
И PassesRule становится:
public bool PassesRules<T>(List<Rule> rules, T toInspect)
{
return rules.All(rule => rule(toInspect));
}
Другое преимущество в том, что вместо передачи строк и выражения выражения я сохраняю поддержку безопасности типов и рефакторинга, которую я терял бы, используя строки и динамически создаваемые выражения.
ДругойОб этом следует помнить, если вы создаете парсер выражений многократного использования, убедитесь, что вы настраиваете тесты в VB, а также в C #, потому что они не всегда генерируют одно и то же дерево выражений под обложками.В частности, добавьте VB-тесты на равенство строк (city = "London").Я видел бесчисленных провайдеров LINQ, которые пропустили этот простой случай.