在单元测试中,我们有一个场景,其中我们创建了一个实现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)和一个List(来自我的伪内存数据存储区),以便可以将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); } } (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您使用了反射来获取上下文和工作单元的类型和属性。现在,您在一侧具有类型为List<>的属性,并且想要为其分配类型为IDbSet<>的属性的内容。这样对吗?理论为此,您需要在ToList上调用IDbSet<>方法,但是此方法不是IDbSet<>接口的一部分。它是在System.Linq.Enumerable静态类中定义的扩展方法。扩展方法只是带有语法糖的静态方法,但仍可以称为常规静态方法。因此,您必须使用反射(获取类型)查找Enumerable类,获取ToList方法的通用方法信息,并将其定位为适当的通用参数(由当前IDbSet<>使用)。然后,您可以将您的set作为参数传递给此方法并调用它。无论如何,更好的方法是避免尽可能多的反思。例如,在TestUnitOfWork上公开特殊接口,该接口可直接访问列表。 (adsbygoogle = window.adsbygoogle || []).push({});
10-05 22:53