委托是否与构造函数一起工作
本文关键字:一起 工作 构造函数 是否 | 更新日期: 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
,因为object
是EFRepository<>
的基类。因此,当您返回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);