Ich lade eine Assembly und rufe eine statische Methode auf, die ein neues Objekt vom Typ "MyClass1" (dieser Typ wird zur Laufzeit angegeben) durch Reflektion mit MethodInfo.Invoke () erzeugt. Dies funktioniert, wenn es sich bei der Methode um eine normale Synchronisierungsmethode handelt. Die aufgerufene Methode ist jedoch eine asynchrone Methode, die Task & lt; MyClass1 & gt; zurückgibt, die verwendet wird, um das Ergebnis unter Verwendung von task.Result abzurufen.
Idealerweise sollte ich MyClass1 als TResult in der Aufgabe verwenden, aber der Typ wird nur zur Laufzeit bestimmt, also kann ich das nicht tun. Ich suche nach einem Weg, um die Aufgabe und das Ergebnis zu bekommen. Ich versuche, das TResult an System.Object zu übergeben und die Klasse als generisches Objekt abzurufen. Das Folgende ist der Code, den ich für diesen Zweck verwende.
%Vor%Nachfolgend wird die Methode (Testcode) durch Reflektion aufgerufen. Das
%Vor%Leider verursacht das Umwandeln von TResult System.InvalidCastException.
%Vor%Wie kann ich das TResult in Task & lt; & gt; zu einem generischen Objekt und das Ergebnis mit task.Result erhalten? Ich würde jede Hilfe bei der Lösung dieses Problems zu schätzen wissen.
Ich lade eine Assembly und rufe eine statische Methode auf, die ein neues Objekt vom Typ "MyClass1" (dieser Typ wird zur Laufzeit angegeben) durch Reflektion mit MethodInfo.Invoke () erzeugt. Dies funktioniert, wenn es sich bei der Methode um eine normale Synchronisierungsmethode handelt. Die aufgerufene Methode ist jedoch eine asynchrone Methode, die Task & lt; MyClass1 & gt; zurückgibt, die verwendet wird, um das Ergebnis unter Verwendung von task.Result abzurufen.
Idealerweise sollte ich MyClass1 als TResult in der Aufgabe verwenden, aber der Typ wird nur zur Laufzeit bestimmt, also kann ich das nicht tun. Ich suche nach einem Weg, um die Aufgabe und das Ergebnis zu bekommen. Ich versuche, das TResult an System.Object zu übergeben und die Klasse als generisches Objekt abzurufen. Das Folgende ist der Code, den ich für diesen Zweck verwende.
%Vor%Nachfolgend wird die Methode (Testcode) durch Reflektion aufgerufen. Das
%Vor%Leider verursacht das Umwandeln von TResult System.InvalidCastException.
%Vor%Wie kann ich das TResult in Task & lt; & gt; zu einem generischen Objekt und das Ergebnis mit task.Result erhalten? Ich würde jede Hilfe bei der Lösung dieses Problems zu schätzen wissen.
Sie können Task<T>
nicht auf Task<object>
anwenden, weil Task<T>
nicht kovariant (es ist auch nicht kontravariant). Die einfachste Lösung wäre, etwas mehr Reflexion zu verwenden:
Dies ist langsam und ineffizient, aber verwendbar, wenn dieser Code nicht oft ausgeführt wird. Nebenbei: Was nutzt eine asynchrone Methode MakeMyClass1
, wenn Sie das Warten auf das Ergebnis blockieren wollen?
Eine andere Möglichkeit besteht darin, zu diesem Zweck eine Erweiterungsmethode zu schreiben:
%Vor%Es ist keine blockierende Lösung und behält den ursprünglichen Zustand / die Ausnahme der Aufgabe bei.
Als Erweiterung der akzeptierten Antwort können Sie die Blockierung vermeiden, indem Sie %code% dazwischen warten:
%Vor%Natürlich ist dies nur dann richtig asynchron, wenn alle Methoden in der Aufrufliste als %code% markiert sind und Sie %code% anstelle von %code% überall verwenden.
Eine andere Möglichkeit besteht darin, zu diesem Zweck eine Erweiterungsmethode zu schreiben:
%Vor%Es ist keine blockierende Lösung und behält den ursprünglichen Zustand / die Ausnahme der Aufgabe bei.
Ich lade eine Assembly und rufe eine statische Methode auf, die ein neues Objekt vom Typ "MyClass1" (dieser Typ wird zur Laufzeit angegeben) durch Reflektion mit MethodInfo.Invoke () erzeugt. Dies funktioniert, wenn es sich bei der Methode um eine normale Synchronisierungsmethode handelt. Die aufgerufene Methode ist jedoch eine asynchrone Methode, die Task & lt; MyClass1 & gt; zurückgibt, die verwendet wird, um das Ergebnis unter Verwendung von task.Result abzurufen.
Idealerweise sollte ich MyClass1 als TResult in der Aufgabe verwenden, aber der Typ wird nur zur Laufzeit bestimmt, also kann ich das nicht tun. Ich suche nach einem Weg, um die Aufgabe und das Ergebnis zu bekommen. Ich versuche, das TResult an System.Object zu übergeben und die Klasse als generisches Objekt abzurufen. Das Folgende ist der Code, den ich für diesen Zweck verwende.
%Vor%Nachfolgend wird die Methode (Testcode) durch Reflektion aufgerufen. Das
%Vor%Leider verursacht das Umwandeln von TResult System.InvalidCastException.
%Vor%Wie kann ich das TResult in Task & lt; & gt; zu einem generischen Objekt und das Ergebnis mit task.Result erhalten? Ich würde jede Hilfe bei der Lösung dieses Problems zu schätzen wissen.
Sie können Task
nicht auf async
anwenden, weil await
nicht kovariant (es ist auch nicht kontravariant). Die einfachste Lösung wäre, etwas mehr Reflexion zu verwenden:
Dies ist langsam und ineffizient, aber verwendbar, wenn dieser Code nicht oft ausgeführt wird. Nebenbei: Was nutzt eine asynchrone Methode .Result
, wenn Sie das Warten auf das Ergebnis blockieren wollen?
Eine andere Möglichkeit besteht darin, zu diesem Zweck eine Erweiterungsmethode zu schreiben:
%Vor%Es ist keine blockierende Lösung und behält den ursprünglichen Zustand / die Ausnahme der Aufgabe bei.
Als Erweiterung der akzeptierten Antwort können Sie die Blockierung vermeiden, indem Sie %code% dazwischen warten:
%Vor%Natürlich ist dies nur dann richtig asynchron, wenn alle Methoden in der Aufrufliste als %code% markiert sind und Sie %code% anstelle von %code% überall verwenden.
Tags und Links c# asynchronous task