嵌套的 func在泛型扩展方法中
本文关键字:泛型 扩展 方法 对象 func 嵌套 | 更新日期: 2023-09-27 18:34:15
我有一个接口定义如下:
public interface IEntityUnitOfWork : IEntityModelUnitOfWork, IDisposable
{
IQueryable<T> IncludeProperties<T>(IQueryable<T> theQueryable, params Func<T, object>[] toInclude)
where T : class, new();
}
。这允许我编写这样的代码:
var foo = MyUnitOfWork.IncludeProperties(
MyUnitOfWork.MyQueryable,
p=>p.MyProperty1,
p=>p.MyProperty2,
...
p=>p.MyPropertyN);
在实现上有一些魔力,这工作得很好。 但这似乎很尴尬。 我想我应该能够写出这个更干净的,所以我可以使用这种格式:
var foo = MyUnitOfWork.Fetch(
f=>f.MyQueryable,
p=>p.MyProperty1,
p=>p.MyProperty2,
...
p=>p.MyPropertyN);
所以我写了一个这样的扩展方法:
public static IQueryable<T> Fetch<T>(
this IEntityUnitOfWork unitOfWork,
Func<IEntityUnitOfWork, IQueryable<T>> queryable,
params Func<T, object>[] toInclude) where T:class, new()
{
var q = queryable.Target as IQueryable<T>;
foreach (var p in toInclude)
{
q = unitOfWork.IncludeProperties(q, new[] { p });
}
return q ;
}
这样可以构建,并且智能感知按我的预期工作,但是当然,当实际尝试使用它时,它会失败并NullReferenceException
。 queryable.Target
,我认为这将是我试图引用的IQueryable<T>
,但似乎不是我假设的那样,而且我在我的智能感知/快速观看选项中没有看到明显的其他选择。
如何将该q
值设置为要在以下语句中引用的IEntityUnitOfWork
的IQueryable<T>
属性?
好的,经过更多的修补,看起来我不想要函数的Target
属性,而是Invoke()
方法:
var q = queryable.Invoke(unitOfWork);
经过一些优化,我使它看起来像这样:
public static IQueryable<T> Fetch<T>(
this IEntityUnitOfWork unitOfWork,
Func<IEntityUnitOfWork, IQueryable<T>> queryable,
params Func<T, object>[] toInclude) where T : class, new()
{
var q = queryable.Invoke(unitOfWork);
return unitOfWork.IncludeProperties(q, toInclude);
}
。这完全符合预期。