按類型訪問對象的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天全站免登陸
全免费A级毛片免费看无码播放