我正在开发一个 C# 系统,一个类有一个返回 a 的函数System.Threading.Tasks.Task
对象并具有属性System.Type
返回类型。
当 ReturnType 为 null 时,我知道该方法返回一个 Task 对象。但遗憾的是,没有办法知道实现该接口的类是否会返回一个Task<ReturnType>
or Task<object>
我需要得到这个方法的结果。我认为最简单的方法是将Task<T>
to Task<object>
这样我就可以获取结果并使用 ReturnType 中的 Type 值来处理它。
我怎样才能转换Task<T>
to Task<object>
不知道 T 的类型?
public interface ITaskFactory
{
ReadOnlyCollection<ParameterInfo> ParametersInfo { get; }
Type ReturnType { get; }
Task CreateTask (params object[] args);
}
我需要得到返回的结果Task
我通过电话收到的CreateTask()
See: http://dotnetfiddle.net/Bqwz0I http://dotnetfiddle.net/Bqwz0I
我已经尝试了很多东西,唯一对我有用的就是使用反射。我还添加了检测没有值的任务并引发异常的代码。
using System;
using System.Threading.Tasks;
using System.Reflection;
public class Program
{
private static async Task<object> Convert(Task task)
{
await task;
var voidTaskType = typeof (Task<>).MakeGenericType(Type.GetType("System.Threading.Tasks.VoidTaskResult"));
if (voidTaskType.IsAssignableFrom(task.GetType()))
throw new InvalidOperationException("Task does not have a return value (" + task.GetType().ToString() + ")");
var property = task.GetType().GetProperty("Result", BindingFlags.Public | BindingFlags.Instance);
if (property == null)
throw new InvalidOperationException("Task does not have a return value (" + task.GetType().ToString() + ")");
return property.GetValue(task);
}
public static async Task Main()
{
Console.WriteLine("Start");
Task i = CreateTask();
Task<object> o = Convert(i);
Console.WriteLine("value: {0}", await o);
Console.WriteLine("value2: {0}", await Convert(Task.FromResult<int>(123)));
//Test for tasks without return values
try
{
Console.WriteLine("value3: {0}", await Convert(Task.CompletedTask));
}
catch (Exception ex)
{
Console.WriteLine("value3: EX {0}", ex.Message);
}
//Test for tasks without return values
try
{
Console.WriteLine("value4: {0}", await Convert(Test4()));
}
catch (Exception ex)
{
Console.WriteLine("value4: EX {0}", ex.Message);
}
Console.WriteLine("Done");
}
private static Task CreateTask()
{
return Task.FromResult("Some result");
}
public static async Task Test4()
{
await Task.CompletedTask;
return;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)