如何将任务<object>转换为任务<SomeType>?



我想在运行时将Task<object>转换为Task<?>,如下所示:

return task.CastTo(targetType);

这是我最好的方法:

[TestMethod]
public void CastToString()
{
var task = CallTaskString("test");
var casting = CastTo<string>(task);
Assert.IsNotNull(casting);
var targetTask = casting as Task<string>;
Assert.IsNotNull(targetTask);
}
private async Task<T> CastTo<T>(Task task)
{
await task.ConfigureAwait(false);
return (T)((dynamic)task).Result;
}
public Task<object> CallTaskString(string value)
{
return Task.Run<object>(() => value);
}

我只是想用一个参数类型targetType替换T:public static async Task CastTo(this Task task, Type targetType).

感谢

可以在运行时调用泛型方法。也许这能帮到你:

public static class TaskExtension
{
public static Task CastTo(this Task task, Type targetType)
{
var taskType = task.GetType();
var srcType = taskType.GetGenericArguments().First();
var method = typeof(TaskExtension).GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Single(m => m.Name == nameof(CastToImpl)).MakeGenericMethod(srcType, targetType);
return (Task)method.Invoke(null, new[] { task });
}
private static Task<R> CastToImpl<T, R>(Task<T> t)
where R : T
{
return t.ContinueWith(t => (R)t.Result); 
}
}

你可以这样使用:

[TestMethod]
public void CastToString1()
{
var task = CallTaskString("test");
var casting = task.CastTo(typeof(string));
Assert.IsNotNull(casting);
var targetTask = casting as Task<string>;
Assert.IsNotNull(targetTask);
}

我想将Task转换为Task运行时

如果Task<T>中的T不是对象,那么这是不可能的,因为Task<T>是不变的。

你似乎想太多了;没有必要发明一种通用的方式来转换任务,您可以简单地转换Task<object>Result:

public async Task<string> SomeInterfaceMethodAsync()
{
return (string) await SomeMethodThatReturnsTaskObjectAsync();
}

最新更新