委托是否与构造函数一起工作

本文关键字:一起 工作 构造函数 是否 | 更新日期: 2023-09-27 17:50:41

我遇到了一个代码,我看到方法返回类型为Func<T, TResult>,我很惊讶地看到这个方法返回的对象是EFRepository类型,其中EFRepository是一个泛型类,EFRepository构造函数接受DbContext类的实例。

protected virtual Func<DbContext, object> DefaultEntityRepositoryFactory<T>() where T : class
{
    return dbContext => new EFRepository<T>(dbContext);
}

EFRepository类:

public class EFRepository<T> : IRepository<T> where T : class
{
    public EFRepository(DbContext dbContext)
    {
        if (dbContext == null) 
            throw new ArgumentNullException("dbContext");
        DbContext = dbContext;
        DbSet = DbContext.Set<T>();
    }
}

谁能解释一下这是怎么回事....

委托是否与构造函数一起工作

protected virtual Func<DbContext, object> DefaultEntityRepositoryFactory<T>()
    where T : class
{
    return dbContext => new EFRepository<T>(dbContext);
}
返回的是一个lambda(参见箭头=>)。lambda是一个匿名函数,它表示一个接受DbContext并返回object的方法,因此类型为Func<DbContext, object>

在lambda中,传入的参数称为dbContext(箭头之前),返回的对象(箭头之后)的类型为EFRepository<T>。每个EFRepository<>都是object,因为objectEFRepository<>的基类。因此,当您返回EFRepository<>时,实际上返回的是Func<DbContext, object>所要求的object

lambda箭头就像下面的命名方法:

static object NamedMethod<T>(dbContext)
    where T : class
{
    return new EFRepository<T>(dbContext);
}

可以这样使用:

protected virtual Func<DbContext, object> DefaultEntityRepositoryFactory<T>()
    where T : class
{
    return NamedMethod<T>;
}

不能委托给构造函数。相反,你可以通过调用new来创建一个对象。

在你的代码中DefaultEntityRepositoryFactory返回一个lambda表达式。lambda表达式接受一个DBContext并创建一个对象。你最终会像这样调用它:

var repositoryFactory = DefaultEntityRepositoryFactory<MyClass>()
var myOject = repositoryFactory(dbContext);