c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
本文介绍了按类型访问对象的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#泛型集实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:按类型访问对象的C#泛型集实现
基础教程推荐
猜你喜欢
- 当键值未知时反序列化 JSON 2022-01-01
- 创建属性设置器委托 2022-01-01
- 如何使用OpenXML SDK将Excel转换为CSV? 2022-01-01
- 使用 SED 在 XML 标签之间提取值 2022-01-01
- 我什么时候应该使用 GC.SuppressFinalize()? 2022-01-01
- Page.OnAppearing 中的 Xamarin.Forms Page.DisplayAlert 2022-01-01
- 从 VB6 迁移到 .NET/.NET Core 的最佳策略或工具 2022-01-01
- C# - 将浮点数转换为整数...并根据余数更改整数 2022-01-01
- C# - 如何列出发布到 ASPX 页面的变量名称和值 2022-01-01
- 覆盖 Json.Net 中的默认原始类型处理 2022-01-01