【发布时间】:2014-01-07 22:31:37
【问题描述】:
这很少需要,但有时仍然有用。
假设有阶段。在第一阶段,您可以访问某些类型 T,但您现在不能使用它。然后,稍后,执行第二阶段,它必须做一些涉及在第一阶段中已知的类型T 的事情。
System.Type 对象不是解决方案,因为与实际类型相比,它们非常有限。例如。你不能写Type type = typeof(int); new List<type>()。
让我们将问题形式化:
public static Something Store<T>() {
//store T and return it
}
public static void Use(Something smth) {
//do something with T (e.g. create a `List<T>` instance and pass it to Console.WriteLine)
}
我怎样才能做到这一点?
更新:
一个示例用例:假设我们有两种不同的独立算法。一个选择元素数据类型(int/float/decimal 等),另一个选择容器类型(List<>/LinkedList<>/HashSet<>/等)。每种类型都有许多可能的类型,并且整个可能的类型集是未知的。现在我们需要编写创建类型化容器的核心代码(例如HashSet<decimal>)。我们不能将这样的代码放入任何一种类型选择算法中。我们想要做的是要求算法以某种方式存储和返回选定的类型。这通常通过类型枚举、System.Type 对象等来完成。但我想要一个静态的强类型编译时解决方案。
【问题讨论】:
-
你知道
Type类,还有反射吗? -
您是否提前知道类型(
T是什么)或者您是否尝试动态实例化类型? -
你不能
List<Type>是什么意思?这很好用(假设你的意思是Type大写T)。 -
@Dialectus 是的,我知道
System.Type(阅读问题)。 -
@SiLo 假设我们正在编写一个库。我们不知道用户稍后会给我们的具体
T。当Store<T>()方法被执行时,显然有T。但我们想保存它以备将来使用。
标签: c# design-patterns types