按類型訪問對象的C#泛型集實現 [英] c# Generic Set<T> implementation to access objects by type
本文介紹了按類型訪問對象的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屋!
查看全文