pschelpdesk/Vendor/Prise.Proxy/TaskCompletionSource.cs
2024-11-04 20:45:34 +01:00

56 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace Prise.Proxy
{
/// <summary>
/// This is a non-generic TaskCompletionSource<T>
/// It allows you to set a type via its constructor
/// </summary>
public class TaskCompletionSource
{
private readonly Type type;
private readonly object taskCompletionSource;
public TaskCompletionSource(Type type)
{
this.type = type;
this.taskCompletionSource = typeof(TaskCompletionSource<>)
.MakeGenericType(type)
.GetConstructors(BindingFlags.Public | BindingFlags.Instance)[0]
.Invoke(null);
}
public bool TrySetCanceled()
{
var trySetCanceled = taskCompletionSource.GetType().GetMethod("TrySetCanceled");
return (bool)trySetCanceled.Invoke(this.taskCompletionSource, null);
}
public bool TrySetException(Exception ex)
{
var trySetException = taskCompletionSource.GetType()
.GetMethods()
.First(m => m.Name == "TrySetException" && m.GetParameters().First().ParameterType == typeof(IEnumerable<Exception>));
return (bool)trySetException.Invoke(this.taskCompletionSource, new[] { new[] { ex } });
}
public bool TrySetResult(object result)
{
var trySetResult = taskCompletionSource.GetType().GetMethod("TrySetResult");
return (bool)trySetResult.Invoke(this.taskCompletionSource, new[] { result });
}
public Task Task
{
get
{
var taskProperty = taskCompletionSource.GetType().GetProperty("Task");
return taskProperty.GetValue(this.taskCompletionSource) as Task;
}
}
}
}