mam klasę statyczną pełne metod rozszerzenie gdzie każda z metod jest asynchroniczna i zwraca jakąś wartość - tak:Obsada Zadanie <T> do zadania <object> w C# bez konieczności T
public static class MyContextExtensions{
public static async Task<bool> SomeFunction(this DbContext myContext){
bool output = false;
//...doing stuff with myContext
return output;
}
public static async Task<List<string>> SomeOtherFunction(this DbContext myContext){
List<string> output = new List<string>();
//...doing stuff with myContext
return output;
}
}
Moim celem jest, aby móc aby wywołać którąkolwiek z tych metod z jednej metody w innej klasie i zwrócić ich wynik jako obiekt. Wyglądałoby to mniej więcej tak:
public class MyHub: Hub{
public async Task<object> InvokeContextExtension(string methodName){
using(var context = new DbContext()){
//This fails because of invalid cast
return await (Task<object>)typeof(MyContextExtensions).GetMethod(methodName).Invoke(null, context);
}
}
}
Problem polega na tym, że obsada kończy się niepowodzeniem. Mój dylemat polega na tym, że nie mogę przekazać żadnych parametrów typu do metody "InvokeContextExtension", ponieważ jest ona częścią koncentratora SignalR i jest wywoływana przez javascript. I do pewnego stopnia nie dbam o metodę zwracania metody rozszerzenia, ponieważ zostanie ona tylko spersonalizowana do JSON i odesłana do klienta javascript. Muszę jednak rzucić wartość zwróconą przez Invoke jako zadanie, aby użyć operatora oczekującego. I muszę podać ogólny parametr z tym "Zadaniem", w przeciwnym razie potraktuje on typ zwrotu jako nieważny. Wszystko sprowadza się do tego, jak pomyślnie rzucić zadanie z ogólnym parametrem T do zadania z ogólnym parametrem obiektu, w którym T reprezentuje wynik metody rozszerzenia.
Dlaczego nie użyć klasy bazowej, 'Zadanie'? Będziesz musiał zrobić refleksję, aby i tak uzyskać wynik ponownie. Albo napisz jakąś metodę, by opisać różnice dla ciebie: 'async Zadanie