我正在开发一个包含大量可重用程序集的C#.NET解决方案。其中三个是:
我在类库中有一个泛型方法:
namespace Company.WebClient {
public class GetData<T>()
{
...
}
}
但是,当我从WinForms程序集中调用该方法时,我传入了一个类库,该类不会知道,因为它包含在数据模型程序集中:
namespace Company.WinFormsApp {
public class App
{
public void Main()
{
Company.WebClient.GetData<TypeFromTheDataModel>();
}
}
}
令人惊讶的是,它似乎有效。但为什么它有效呢? webclient程序集没有对数据模型程序集的硬编码引用,所以我很惊讶它没有报告“未找到类型”或某些此类错误。这是一种安全的工作方式,还是应该为项目添加更多引用(即从类库到数据模型)?
答案 0 :(得分:2)
图书馆不需要知道关于类型的任何信息 - 毕竟,它不是试图使用该类型的任何成员。在执行时GetData
可以找到T
- 但在编译时它不需要。
试想 - 如果没有工作,那么LINQ to Objects将完全被破坏,因为你只能将它用于系统类型的序列!
基本上,这样做是完全安全的。
答案 1 :(得分:1)
这基本上就是泛型。 CLR 在运行时知道定义要用于T
的类型的特定类;您在GetData
中编写的代码说明如何处理T
类型的对象。 CLR 提供拼接,因此您无需考虑它。
请注意,在此示例中,您没有在T
上放置约束(没有where
子句)。这意味着您可以使用T
- 类型对象执行的操作将其视为object
,这不是很有用。如果你将它们限制为实现接口IMoreInteresting
,那么库和调用者都需要访问IMoreInteresting
的定义。