嵌套的 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 ;
}

这样可以构建,并且智能感知按我的预期工作,但是当然,当实际尝试使用它时,它会失败并NullReferenceExceptionqueryable.Target ,我认为这将是我试图引用的IQueryable<T>,但似乎不是我假设的那样,而且我在我的智能感知/快速观看选项中没有看到明显的其他选择。

如何将该q值设置为要在以下语句中引用的IEntityUnitOfWorkIQueryable<T>属性?

嵌套的 func<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);
}

。这完全符合预期。