侧边栏

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";
      });

}
posted @   我有我的骄傲  阅读(774)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示