- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们在单元测试中有一个场景,我们在其中创建了一个实现 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/
我确信这是非常基本的,但我在构建通用方法时遇到了问题。我有无数在我的 DBContext 中声明的接口(interface)类( IDbSet 、 IDbSet 等)。我想将它们传递给处理它们的方法。
有没有办法使用这个答案中描述的方法No FindAsync() method on IDbSet对于 DbContext 的 DbSet 属性? 编辑: 链接的答案包含如何构建从 IDbSet 继承的
我正在尝试在一个新项目中对我的第一个存储库进行单元测试,我们决定在该项目中主要使用 EF6 来处理异步内容。我在为我的模型伪造 IDbSet 并允许在使用新的异步细节之前使用任何 Linq 时遇到问题
public abstract class RepositoryBase : IRepository where T : class { private ShopCoreDbContext d
有什么区别 public IDbSet Chirps { get; set; } 和 public DbSet Chirps { get; set; } 它们一样吗? 最佳答案 Sam I am's
给定一个 IDbSet,其中 Person 包含一个“Id”属性,我如何才能执行以下命令: var p = PersonDbSet.FirstOrDefault(i=>i.Id = 3); 我可以构建
我根本无法让它工作。我的测试中有这段代码: MockRepository repository = new MockRepository(); IDbSet userSet = repository.
FindAsync() 是否有原因? IDbSet 中省略了方法界面? Find是界面的一部分,异步版本不可用似乎很奇怪。我需要转换到 DbSet访问它,这有点麻烦: User user = awai
我正在尝试模拟 System.Data.Entity.IDbSet 以使其返回一些数据(在本例中只是一个空集合): var mock = new Mock>(); mock.Setup(x => x.
我正在尝试模拟 System.Data.Entity.IDbSet 以使其返回一些数据(在本例中只是一个空集合): var mock = new Mock>(); mock.Setup(x => x.
我想使用 IDbSet<> 实现通用存储库模式 Entity Framework 的接口(interface)。 当我问IDbSet时来自 Autofac,它应该解析 IDbContext然后调用它的
我想让 visual studio 创建的 T4 模板将我的实体输出为 IDbset 而不是 DbSet,知道怎么做吗? 最佳答案 我假设您已经有一个生成 DbContext 的 t4 模板.所以只需
我们在单元测试中有一个场景,我们在其中创建了一个实现 IDbSet 的 FakeDbSet。在 FakeUnitOfwork 中,我有一些属性是 IDbSets 并使用 FakeDbSet 进行更新。
我正在尝试基于 MyFinance 创建一个基础存储库类首先使用实体框架代码的示例。我想将其更改为仅使用 Entity Framework 。该示例使用 IDbSet ,但我不知道要将其更改为普通
我以前从未真正做过单元测试,而且我在第一次测试时跌跌撞撞。问题在于 _repository.Golfers.Count(); 始终指示 DbSet 为空。 我的测试很简单,我只是想添加一个新的高尔夫球
我正在尝试模拟实现 IDbSet ,而我恰好在 F# 中这样做。 type MockDbSet(items:seq) = let collection = ResizeArray(items)
在 EF 4.1+ 中,这两行代码之间有区别吗? dbContext.SomeEntitySet.Add(entityInstance); dbContext.Entry(entityInstance
我正在尝试使用Moq对 Entity Framework Code First 类进行一些测试。我对起订量和模拟技术非常陌生,我想知道是否可以轻松地进行我将在下面描述的测试。我在网上搜索了一些解决方案
我正在尝试使用 Moq 框架模拟 IDbSet。单元测试应向现有模拟 DbSet 集合 (SetUp) 添加新记录(实体)并返回新集合的计数。 我的 TestInitialize 设置如下所示: pu
我正在通过实现 IDbSet 接口(interface)来实现 FakeDataSet 类。作为实现此接口(interface)的一部分,我必须实现 Find 方法。我所有的实体类都有一个 Guid
我是一名优秀的程序员,十分优秀!