将类型传递给未知的类库通用方法 - 为什么它可以工作

时间:2012-07-06 12:41:53

标签: c# .net visual-studio generics

我正在开发一个包含大量可重用程序集的C#.NET解决方案。其中三个是:

  • 一个WinForms程序集
  • 一个webclient类库
  • 包含数据模型类的程序集

我在类库中有一个泛型方法:

namespace Company.WebClient {
  public class GetData<T>()
  {
    ...
  }
}

但是,当我从WinForms程序集中调用该方法时,我传入了一个类库,该类不会知道,因为它包含在数据模型程序集中:

namespace Company.WinFormsApp {
  public class App 
  {
    public void Main()
    {
      Company.WebClient.GetData<TypeFromTheDataModel>();
    }
  }
}

令人惊讶的是,它似乎有效。但为什么它有效呢? webclient程序集没有对数据模型程序集的硬编码引用,所以我很惊讶它没有报告“未找到类型”或某些此类错误。这是一种安全的工作方式,还是应该为项目添加更多引用(即从类库到数据模型)?

2 个答案:

答案 0 :(得分:2)

图书馆不需要知道关于类型的任何信息 - 毕竟,它不是试图使用该类型的任何成员。在执行时GetData 可以找到T - 但在编译时它不需要。

试想 - 如果没有工作,那么LINQ to Objects将完全被破坏,因为你只能将它用于系统类型的序列!

基本上,这样做是完全安全的。

答案 1 :(得分:1)

这基本上就是泛型。 CLR 在运行时知道定义要用于T的类型的特定类;您在GetData中编写的代码说明如何处理T类型的对象。 CLR 提供拼接,因此您无需考虑它。

请注意,在此示例中,您没有在T上放置约束(没有where子句)。这意味着您可以使用T - 类型对象执行的操作将其视为object,这不是很有用。如果你将它们限制为实现接口IMoreInteresting,那么库和调用者都需要访问IMoreInteresting的定义。