代表是否与构造函数一起工作?

时间:2014-03-18 09:42:52

标签: c# entity-framework

我遇到了一个代码,我将方法返回类型视为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>();
    }
}

请有人解释这里发生了什么......

2 个答案:

答案 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,因为objectEFRepository<>的基类。因此,当您返回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);