从 GetType 制作可转换类型?

Make a castable type from GetType?

在下面的代码片段中进行了解释,我无法理解其语法:

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 返回的内容执行此操作。

如果您不介意牺牲编译时类型安全性,您可以像这样使用 Convert.ChangeType()dynamic 关键字:

static dynamic ConvertTo(this object source, Type targetType)
{
    return (dynamic)Convert.ChangeType(source, targetType)
}

public void YourActualCode()
{
    object tcsObject = new TaskCompletionSource<Apple>();
    Apple apple = new Apple();

    TaskCompletionSource<Apple> tsc = ConvertTo(tscObject, typeof(TaskCompletionSource<Apple>))
}

这种方法的好处是您可以将参数类型的确定推迟到运行时:

var wrapperType = typeof(TaskCompletionSource<>);
var paramType = typeof(Apple);

var concreteType = wrapperType.MakeGenericType(paramType);

TaskCompletionSource<Apple> tsc = ConvertTo(tscObject, concreteType);