【发布时间】:2020-12-09 05:47:22
【问题描述】:
在下面的代码sn-p中进行了解释,我无法弄清楚它的语法:
object tcsObject = new TaskCompletionSource<Apple>();
Apple apple = new Apple();
// How do I do this?
TaskCompletionSource<apple.GetType>() tsc = tscObject as TaskCompletionSource<apple.GetType>()
编辑 应该注意我试图弄清楚的特定问题是如何在最初不知道类型是 Apple 的情况下进行这种泛型转换。类型最终可能是任何东西,所以我希望从通过 GetType 返回的内容中执行此操作。
【问题讨论】:
-
您可以使用反射,但问题是所有将使用它的进一步代码也需要使用反射。将其屏蔽为
TaskCompletionSource<object>不是更好吗? -
您不能将动态类型传递给泛型。泛型是编译时的概念,GetType 在运行时运行
-
你不能。编译器需要在编译时知道每个变量的类型。使用已知的固定类型或使用您自己的范围内泛型类型参数。
-
在那个例子中,类型总是
Apple,那你为什么不直接使用TaskCompletionSource<Apple>呢? -
您可以创建一个方法,其中包含需要使用
TaskCompletionSource<T>的所有代码,然后使用反射来调用该方法,那么您至少可以最大限度地减少所需的反射量。
标签: c# generics reflection