c# - resueltos - reflexion especular
Esperar el resultado de la tarea<TDerived> utilizando la reflexión en un método no genérico (1)
Según mi comentario:
A diferencia de las interfaces, los tipos concretos como
Task<TResult>no pueden ser covariantes. Ver ¿Por qué la tarea no es covariante? . Por lo tanto, laTask<B>no se puede asignar a unaTask<A>.
La mejor solución que puedo pensar es utilizar el tipo de Task subyacente para realizar la await manera:
var task = (Task)method.Invoke(this, new object[] { "humpf" });
await task;
Luego puede usar la reflexión para obtener el valor del Result :
var resultProperty = typeof(Task<>).MakeGenericType(type).GetProperty("Result");
A a = (A)resultProperty.GetValue(task);
return a.Id;
Considere el siguiente caso:
class A
{
public int Id;
}
class B : A
{
}
class Main
{
public async Task<int> Create(Type type)
{
MethodInfo method = this.GetType().GetMethod("Create", new Type[] { typeof(string) }).MakeGenericMethod(new Type[] { type });
A a = await (Task<A>)method.Invoke(this, new object[] { "humpf" });
return a.Id;
}
public async Task<T> Create<T>(string name) where T : A
{
T t = await Foo.Bar<T>(name);
return t;
}
}
Llamar al new Main().Create(typeof(B)) fallará con un
No se puede convertir el objeto de tipo ''
System.Threading.Tasks.Task[B]'' para escribir ''System.Threading.Tasks.Task[A]''
No entiendo del todo porque en este caso, el método Generic Create<T> solo puede devolver una Task<T> donde T siempre se deriva de '' A '', pero tal vez me falta un caso de borde aquí. Además de eso, ¿cómo puedo hacer que esto funcione? ¡Gracias!