4

我正在开发具有大量可重用程序集的 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 程序集没有对数据模型程序集的硬编码引用,所以我很惊讶它没有报告“找不到类型”或一些此类错误。这是一种安全的工作方式,还是我应该向我的项目添加更多引用(即从类库到数据模型)?

4

2 回答 2

2

库不需要知道任何关于类型的信息——毕竟它没有尝试使用该类型的任何成员。在执行时GetData 可以发现T- 但在编译时不需要。

试想一下 - 如果这不起作用,那么 LINQ to Objects 将完全被破坏,因为您只能将它用于系统类型的序列!

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

于 2012-07-06T12:47:45.870 回答
1

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

请注意,在此示例中,您没有设置任何约束T没有where子句)。这意味着您对 -type 对象所能做的T就是将它们视为object,这并不是那么有用。如果你限制他们,比如说,实现一个接口IMoreInteresting,那么库和调用者肯定都需要访问IMoreInteresting.

于 2012-07-06T12:48:24.137 回答