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!