【问题标题】:How do I pass a class to a generic without hardcoding the class?如何在不对类进行硬编码的情况下将类传递给泛型?
【发布时间】: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&lt;T&gt;?显然,如果需要更改 51,GenericGetList 方法可能也需要调整。

如果您还没有弄清楚,最终目标是能够将任何课程传递给GenericGetList&lt;T&gt; 并使其适用于该课程。所以从GetListMySchool 我可以填写IList&lt;MySchool&gt; 的列表,而从GetListMyTeacher 我可以填写IList&lt;MyTeacher&gt; 的列表。 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&lt;MySchool&gt; myList_Dynamic = new GenericGetList&lt;MySchool&gt;().GetList(); 而不是IList&lt;MySchool&gt; myList_Dynamic = new List&lt;MySchool&gt;(); GetList_Dynamic(new MySchool(), ref myList_Dynamic);
  • 磁控管,我很抱歉。当我简化我的代码以去除数据库访问以便我可以 Fiddle 它时,我将它简化得太多了。让我通过示例来说明为什么我需要调用中间方法。

标签: c# generics dynamic


【解决方案1】:

这是学习使用泛型时的常见误解。泛型类型必须在编译时声明;它们不能在运行时设置,因为使用泛型的全部目的是确保类型安全。编译器确保当&lt;Employee&gt;GenericPopulator 的类型参数时,CreateList 将返回List&lt;Employee&gt;。在您的小提琴中,它不知道应该如何将MySchool 转换为MyClass。因此,根本不可能按照您的要求进行操作。

您可能需要阅读泛型:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多