【发布时间】:2020-01-08 16:31:19
【问题描述】:
我正在使用Bryan Tubbs' excellent code for populating a list generically。这一切都很好。
在他的代码中,他将员工类传递给他的GenericPopulator 方法。
var employeeList = new Classes.GenericPopulator<employee>().CreateList(reader);
我正在尝试提出一个更加动态的解决方案。我一般如何通过employee 类?或者它可能是动态的?或者也许我必须使用反射?似乎有一种方法可以做到这一点,但我不能完全正确地获得语法。我尝试传递类、typeof(class)、类型、该类型的对象,可能还有其他一些猜测。我不能让他们中的任何一个工作。
我有一个小提琴here...
第 44 行通过 MySchool 工作。但我真正想要的是让第 51 行工作。如果我注释掉 44 并取消注释 51,Visual Studio 会给出无法隐式转换类型错误(在 Fiddle 中,它会给出未找到类型或命名空间错误)。我需要对第 51 行做什么才能正确地将MyClass 传递给GenericGetList<T>?显然,如果需要更改 51,GenericGetList 方法可能也需要调整。
如果您还没有弄清楚,最终目标是能够将任何课程传递给GenericGetList<T> 并使其适用于该课程。所以从GetListMySchool 我可以填写IList<MySchool> 的列表,而从GetListMyTeacher 我可以填写IList<MyTeacher> 的列表。 GetListXXX 可以将类硬编码到其中,但 GenericGetList 需要使用传递给它的任何类。这可能吗?
谢谢!
编辑
编辑第 32 行以按照威震天的建议进行更改
IList<MySchool> myList_Dynamic = new GenericGetList<MySchool>().GetList();
确实适用于我最初发布的代码。然而,我在第 34 行调用 GetList_Dynamic 的原因是因为在我的未简化/未处理版本的代码中,我的 GetList 函数需要传递一个 SqlDataReader。
GetList_Dynamic 函数获取数据读取器,然后调用GetList。所以我修改了 Fiddle 代码以显示 GetList 接收 SqlDataReader 参数。这需要我更改第 44 行以传递数据读取器,并在第 42 行添加数据读取器。调用数据库、填充读取器、处理错误等的代码将在第 42 行和第 44 行之间进行。
回到威震天的想法,即简单地编辑第 32 行...我当时没有数据阅读器能够将其传递给 GetList 方法。因此,我希望在第 34 行传递 一些东西,一旦我的数据阅读器全部填充完毕,以后可以使用。
我已更新 Fiddle 以包含 SqlDataReader。
【问题讨论】:
-
您可以使用接口来执行此操作。
-
你为什么要创造一种新的方法来做你已经在做的事情?只需使用
IList<MySchool> myList_Dynamic = new GenericGetList<MySchool>().GetList();而不是IList<MySchool> myList_Dynamic = new List<MySchool>(); GetList_Dynamic(new MySchool(), ref myList_Dynamic); -
磁控管,我很抱歉。当我简化我的代码以去除数据库访问以便我可以 Fiddle 它时,我将它简化得太多了。让我通过示例来说明为什么我需要调用中间方法。