snell resueltos refraccion reflexion luz ley especular ejercicios como calcular angulo c# generics reflection async-await

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, la Task<B> no se puede asignar a una Task<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!