gpt4 book ai didi

c# - 将 Task 中的 TResult 转换为 System.Object

转载 作者:太空狗 更新时间:2023-10-29 17:28:41 35 4
gpt4 key购买 nike

我正在加载一个程序集并调用一个静态方法,该方法将使用 MethodInfo.Invoke() 通过反射创建一个类型为“MyClass1”(此类型在运行时指定)的新对象。当该方法是普通同步方法时,这很好用。但是,被调用的方法是返回 Task 的异步方法,它将用于使用 task.Result 检索结果。

理想情况下,我应该在任务中使用 MyClass1 作为 TResult,但类型仅在运行时确定,因此我不能这样做。我正在寻找一种方法来获得任务和结果。我正在尝试将 TResult 转换为 System.Object 并将该类作为通用对象获取。以下是我为此目的使用的代码。

public static void LoadAssembly()
{
// Calling static async method directly works fine
Task<MyClass1> task1 = MyClass1.MakeMyClass1();
MyClass1 myClass1 = task1.Result;

// Calling static async method through reflection through exception.
Assembly assembly = Assembly.LoadFrom(dllName);
Type type = assembly.GetType("AsyncDll.MyClass1");
var types = assembly.GetTypes();
MethodInfo[] methodInfos = types[0].GetMethods(BindingFlags.Public | BindingFlags.Static);
Type myClassType = types[0];
MethodInfo mi = myClassType.GetMethod("MakeMyClass1");
Object obj = Activator.CreateInstance(mi.ReflectedType);
Task<Object> task = (Task<Object>)mi.Invoke(obj, null); // Exception occurs here.
Object result = task.Result;
}

以下是通过反射调用的方法(测试代码)。这个

public class MyClass1
{
public static async Task<MyClass1> MakeMyClass1()
{
MyClass1 newObject = null;
await Task.Run(() =>
{
newObject = new MyClass1();
});
return newObject;
}
...
}

不幸的是,TResult 的转换导致了 System.InvalidCastException。

An unhandled exception of type 'System.InvalidCastException' occurred in Test.exe

Additional information: Unable to cast object of type 'System.Threading.Tasks.Task`1[MyClass1]' to type 'System.Threading.Tasks.Task`1[System.Object]'.

如何将 Task<> 中的 TResult 转换为通用对象并使用 task.Result 获取结果?如果能帮助解决此问题,我将不胜感激。

最佳答案

你不能投Task<T>Task<object> ,因为 Task<T>不是 covariant (它也不是逆变的)。最简单的解决方案是使用更多反射:

var task   = (Task) mi.Invoke (obj, null) ;
var result = task.GetType ().GetProperty ("Result").GetValue (task) ;

这很慢且效率低下,但如果此代码不经常执行则可用。顺便说一句,异步 MakeMyClass1 有什么用?方法是否要阻塞等待其结果?

关于c# - 将 Task<TResult> 中的 TResult 转换为 System.Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805564/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com