按类型访问对象的C#泛型集实现 [英] c# Generic Set<T> implementation to access objects by type

查看:0
本文介绍了按类型访问对象的C#泛型集实现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在进行一个Net Core WebApi项目,并实现工作单元模式以访问数据库中的记录。

考虑以下课程:

工作单位:

public class UnitOfWork : IUnitOfWork
{
    public IBooksRepository Books { get; }

    public ICatalogueRepository Catalogues { get; }
    
    ...
}

Api控制器:

public class StudentController: ApiController
{
    private IUnitOfWork _unitOfWork;
    public StudentController(IUnitOfWork UnitOfWork)
    {
        _unitOfWork = UnitOfWork;
    }

    public IActionResult Get()
    {
       var books =   _unitOfWork.Books.GetAll();
        return Ok(books);
    }
}

}

目前我正在使用上述方法从数据库中检索记录, 我希望访问存储库对象,如下所示。

var books =   _unitOfWork.Set<IBooksRepository>.GetAll();

类似于EntityFrameworkDBContext类中的Set<T>方法,其目的是使控制器类泛型并以泛型方式执行GET操作。

我如何实现像Set<T>方法一样从UnitOfWork类中查找存储库对象?

推荐答案

我同意罗伯特·哈维的观点。但是,如果您想要这样做,一种方法是稍微重构一下代码,然后使用反射:

您可以稍微重构一下代码:

public class UnitOfWork : IUnitOfWork
{
    public IRepository<Book> Books { get; }

    public IRepository<Catalogue> Catalogues { get; }

    public IRepository<T> Set<T>()
    {
        var allProperties = this.GetType().GetProperties();

        var property = allProperties.SingleOrDefault(p => p.PropertyType == typeof(IRepository<T>) );
        return (IRepository<T>) property.GetValue(this);
    }
}

这只是一个初学者/想法,您可以更多地根据您的环境进行调整(优化、个人选项等)。

PS:您编写了类似于EF的Set<T>";的";,但在代码示例中没有使用";实体类型";来获取存储库。您可以将我的示例进一步简化为检查T并返回T,而不是IRepository<T>

public T Set<T>()
{
    var allProperties = this.GetType().GetProperties();

    var property = allProperties.SingleOrDefault(p => p.PropertyType == typeof(T) );
    return (T)property.GetValue(this);
}

然而,这似乎很愚蠢。我认为如果您要使用通用存储库&路径,则应该有IRepository<T>

这篇关于按类型访问对象的C#泛型集实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆