我遇到了一个代码,我将方法返回类型视为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>();
}
}
请有人解释这里发生了什么......
答案 0 :(得分:2)
protected virtual Func<DbContext, object> DefaultEntityRepositoryFactory<T>()
where T : class
{
return dbContext => new EFRepository<T>(dbContext);
}
返回的是 lambda (参见arraow =>
)。 lambda是一个匿名函数,表示一个接收DbContext
并返回object
的方法,因此类型为Func<DbContext, object>
。
在lambda中,传入的参数称为dbContext
(箭头前),返回的对象(箭头后)的类型为EFRepository<T>
。每个EFRepository<>
都是object
,因为object
是EFRepository<>
的基类。因此,当您返回EFRepository<>
时,您实际上已根据object
的要求返回Func<DbContext, 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>;
}
答案 1 :(得分:1)
您无法拥有构造函数的委托。相反,你可以有一个委托,通过调用new来创建一个对象。
在您的代码中DefaultEntityRepositoryFactory
返回一个lambda表达式。 lambda表达式采用DBContext
并创建一个对象。你最终会这样称呼它:
var repositoryFactory = DefaultEntityRepositoryFactory<MyClass>()
var myOject = repositoryFactory(dbContext);