C# 通过反射获取async方法返回值
首先,先看看非异步方法如何获得。
class Program
{
static void Main(string[] args)
{
MethodInfo methodInfo = typeof(Program).GetMethod("SayHello");
object result = methodInfo.Invoke(new Program(), new object[] { "张三" });
Console.ReadKey();
}
public string SayHello(string name)
{
Console.WriteLine($"我叫{name}");
return "OK";
}
}
看起来非常简单,因为Invoke的返回值就是Object,到时候只需要强转一下即可。
那,如果是异步方法呢?
class Program
{
static void Main(string[] args)
{
MethodInfo methodInfo = typeof(Program).GetMethod("SayHello");
object result = methodInfo.Invoke(new Program(), new object[] { "张三" });
Console.ReadKey();
}
public async Task<string> SayHello(string name)
{
return await Task.Run(() =>
{
Console.WriteLine($"我叫{name}");
return "OK";
});
}
}
可以看到返回值,但不是我们想要的结果。
于是想到,大概可能是要等待结果返回。于是调用Wait。
static void Main(string[] args)
{
MethodInfo methodInfo = typeof(Program).GetMethod("SayHello");
Task result =(Task) methodInfo.Invoke(new Program(), new object[] { "张三" });
result.Wait();
Console.ReadKey();
}
但是又有一个问题,结果还是拿不到啊,因为Task 没有Result的属性,且GetAwaiter().GetResult()返回值也是void。
总不能每个方法都强转成对应的Tsak泛型吧,像这样??那泛型类型有int,string ,double。。。简直要人老命。
static void Main(string[] args)
{
MethodInfo methodInfo = typeof(Program).GetMethod("SayHello");
Task<string> result = (Task<string>)methodInfo.Invoke(new Program(), new object[] { "张三" });
result.Wait();
string mes = result.Result;
Console.ReadKey();
}
public async Task<string> SayHello(string name)
{
return await Task.Run(() =>
{
Console.WriteLine($"我叫{name}");
return "OK";
});
}
莫愁前路无知己,天下谁人不会敲。立马就想到了动态类型。当然了,Result就可以是Object了嘛。
static void Main(string[] args)
{
MethodInfo methodInfo = typeof(Program).GetMethod("SayHello");
dynamic result = methodInfo.Invoke(new Program(), new object[] { "张三" });
result.Wait();
string mes = result.Result;
Console.ReadKey();
}
public async Task<string> SayHello(string name)
{
return await Task.Run(() =>
{
Console.WriteLine($"我叫{name}");
return "OK";
});
}
笨一点没关系,只要自己不放弃自己
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器