3
我有下面的代码:执行ToLower将上表表达式抛出异常
public Expression FilterString(string property, string value, ParameterExpression parameter)
{
//Create Message MemberExpression from parameter and properted eg/Message.Body
var getname = Expression.Property(parameter, property);
//Create expression for Not IsNullOrEmpty
var isnullorempty = Expression.Not(Expression.Call(typeof(string), "IsNullOrEmpty", null, getname));
//Create expression for member property equal to value eg/Message.Body = "hi"
var toLower = Expression.Call(getname,
typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
var compare = Expression.Equal(toLower, Expression.Constant(value));
//Create expression combining Not IsNullOrEmpty AND Equal To
var condition = Expression.And(isnullorempty, compare);
return condition;
}
如果我运行下面的测试中,我得到一个NullReferenceException
,我想是因为一些项目有一个空的身体,但正是那Expression
应该正在测试。
private IEnumerable<Message> GetMessages()
{
var list = new List<Message>();
var message = new Message() { Body = null, Properties = new Collection<MessageProperty>() };
list.Add(message);
message = new Message() { Body = "", Properties = new Collection<MessageProperty>() };
list.Add(message);
message = new Message() { Body = "Hello Everybody", Properties = new Collection<MessageProperty>() };
list.Add(message);
message = new Message() { Flag = 1, Properties = new Collection<MessageProperty>() };
list.Add(message);
message = new Message() { ChannelInt = 1, Properties = new Collection<MessageProperty>() };
list.Add(message);
message = new Message() { Properties = new Collection<MessageProperty>(new[] { new MessageProperty() { Key = "Gender", Value = "male" } }) };
list.Add(message);
return list;
}
[Theory]
[InlineData("Hello Everybody")]
[InlineData("hello everybody")]
public void FilterString_NullAndEmptyMessages_Removed(string searchTerm)
{
var messageList = GetMessages();
var parameter = Expression.Parameter(typeof(Message), "message");
var equalToFilterType = new EqualToFilterType();
var filter = equalToFilterType.FilterString("Body", searchTerm, parameter);
var lambda = Expression.Lambda(filter, parameter);
//******EXCEPTION*******//
var result = messageList.AsQueryable().Where((Expression<Func<Message, bool>>)lambda).ToList();
Assert.Equal(1, result.Count);
}
任何想法如何让这个测试通过? (我表达的代码将被用来打的SQL Server太BTW)
如果我的回答对你不起作用,如果你将它包装成一个简短但完整的控制台应用程序,我们可以为自己测试,这将非常有帮助。 –