我有这个错误:
System.ArgumentException:静态方法需要null实例,非静态方法需要非null实例。 参数名称:方法
但是它在一个地方被提升,而在另一个地方,在同一场景中却没有。例如,在这种用法中,一切正常:
public async Task<ValueServiceResult<PagedEnumerable<GenreDto>>> List(int page, int pageSize, int? parentCategory = null)
{
return await TryCatchAsync(async () =>
{
var whereQuery = parentCategory.HasValue
? GetExpression<Genre>(g => g.ParentCategoryId == parentCategory.Value)
: null;
var items = await Repository.GeneralQueryPaged(page, pageSize, whereQuery,
c => c.Name);
var mappedResult = Mapper.Map<IEnumerable<GenreDto>>(items);
return new ValueServiceResult<PagedEnumerable<GenreDto>>(new PagedEnumerable<GenreDto>(mappedResult, items.Total, pageSize));
});
}
在另一种用法中,它引发了异常:
public async Task<ValueServiceResult<PagedEnumerable<ArtistDto>>> List(int page, int pageSize, string filter)
{
return await TryCatchAsync(async () =>
{
if (!string.IsNullOrEmpty(filter))
filter = filter.Trim().ToLower();
var whereQuery = !string.IsNullOrEmpty(filter)
? GetExpression<Artist>(a => true) /*a.Name.ToLower().Contains(filter)*/
: null;
var items = await Repository.GeneralQueryPaged(page, pageSize, whereQuery, c => c.Name);
var mappedResult = Mapper.Map<IEnumerable<ArtistDto>>(items);
return new ValueServiceResult<PagedEnumerable<ArtistDto>>(new PagedEnumerable<ArtistDto>(mappedResult, items.Total, pageSize));
});
}
GetExpression
电话会引发异常。这是父类中的静态方法。这就是它的实现方式:
public static Expression<Func<TEntity, bool>> GetExpression<TEntity> (Func<TEntity, bool> funct)
{
return Expression.Lambda<Func<TEntity, bool>>(Expression.Call(funct.Method));
}
我无法理解,如何在一次使用中引发此错误,而在另一种用法中不会引发此错误。我在这里缺少什么?
答案 0 :(得分:2)
请勿使用Expression.Call
,这仅用于调用实际方法。
使用Expression.Invoke
来调用委托。
为什么Call
可能在某些地方工作而不是其他地方有很多原因 - 最有可能的是,这种工作有一个闭合,而那个没有......并没有... #39;吨。我仍然期望在运行时中断所有内容,因为你永远不会将正确的参数传递给Expression.Call
- 你需要传递lambda参数(在闭包的情况下,闭包)实例)。
请注意,如果您使用此辅助方法与Entity Framework等接口进行接口,则很可能无论如何都不会起作用 - 在C#中,方法不会自动引用,因此EF看到的只是方法调用 - 它没有在方法内部看到。如果您之后仅使用此功能(例如使用Compile().Invoke()
),那么您就可以了。
代码示例:
public static Expression<Func<TEntity, bool>> Wrap<TEntity>(Func<TEntity, bool> func)
{
var entity = Expression.Parameter(typeof(TEntity));
return
Expression.Lambda<Func<TEntity, bool>>
(
Expression.Invoke(Expression.Constant(func), entity),
entity
);
}