gpt4 book ai didi

c# - 使用反射将 IDbSet 的属性复制到另一个同名的 List 类的属性?

转载 作者:行者123 更新时间:2023-11-30 17:14:44 26 4
gpt4 key购买 nike

我们在单元测试中有一个场景,我们在其中创建了一个实现 IDbSet 的 FakeDbSet。在 FakeUnitOfwork 中,我有一些属性是 IDbSets 并使用 FakeDbSet 进行更新。

无需在我的 Commit 方法中写出每个不同的属性,我尝试使用反射来迭代 FakeUnitOfWork 中的属性。然后我想将属性值复制到具有相同类型的 List<> 属性的不同类。所以我的 FakeUnitOfWork 中可能有一个属性:

IDbSet<User> Users {get {return _users ?? (_users = new FakeDbSet<User>());}

在我的假数据存储中我有这个属性:

List<User> Users {get;set;}

这是我目前所拥有的:

public void Commit()
{
foreach (var property in typeof(TestUnitOfWork).GetProperties())
{
var testContextType = typeof (TestDataContext).GetProperty(property.Name);
//I then want to do a ToList() on the TestUnitOfWork IDbSet properties to push them into the TestDataContext.


}
}

所以,我不确定如何知道我正在查看一个 IDbSet(来自 FakeUnitOfWork)和一个列表(来 self 的假内存数据存储),以便我可以将数据从 FakeUnitOfWork 复制到数据存储.由于它们具有相同的名称,我只需要弄清楚如何通过反射进行转换。

更新:我试过这样的事情,认为我可能在正确的轨道上,但代码永远不会被击中:

foreach (var property in typeof(TestUnitOfWork).GetProperties())
{
var testContextType = typeof (TestDataContext).GetProperty(property.Name);
if(property.GetValue(this,null) is IDbSet<MyBaseEntityType>)
{
testContextType.SetValue(TestDataContext, ((IDbSet<MyBaseEntityType>) property.GetValue(this,null)).ToList(),null);
}


}

最佳答案

您使用了反射来获取上下文和工作单元的类型和属性。现在您拥有类型为 List<> 的属性一方面,您想分配 IDbSet<> 类型的属性内容给它。对吗?

理论

为此,您需要调用 ToList IDbSet<> 上的方法但此方法不是 IDbSet<> 的一部分界面。它是 System.Linq.Enumerable 中定义的扩展方法静态类。扩展方法只是带有语法糖的静态方法,但它仍然可以像普通静态方法一样被调用。所以你必须查找 Enumerable使用反射(获取类型)的类,获取 ToList 的通用方法信息方法并将其定位到适当的通用参数(由当前 IDbSet<> 使用)。然后您可以将您的设置作为参数传递给此方法并调用它。

无论如何,更好的方法是尽可能避免反射。例如在 TestUnitOfWork 上公开特殊接口(interface)这将提供对列表的直接访问。

关于c# - 使用反射将 IDbSet<T> 的属性复制到另一个同名的 List<T> 类的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com