【问题标题】:Action values are not updating an instance when using Invoke [duplicate]使用 Invoke 时,操作值不会更新实例 [重复]
【发布时间】:2020-08-14 14:37:57
【问题描述】:

我在 ASP.NET Core 3.1 中有一个使用 Action 的扩展方法:

public static IApplicationBuilder UseSitemap(this IApplicationBuilder builder, Action<(String BaseUrl, String Route)> options) {

  (String BaseUrl, String Route) sitemapOptions = ("", "/sitemap"); // Default values

  options?.Invoke(sitemapOptions);

  return builder.MapWhen(x => x.Request.Path.StartsWithSegments(sitemapOptions.Route), x => x.UseMiddleware<SitemapMiddleware>(sitemapOptions));

}

那我使用如下:

  application.UseSitemap(x => { 
    x.BaseUrl = "https://locahost:80";
    x.Route = "/sitemap.xml"; 
  });

但是,sitemapOptions 没有获取新值。为什么?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-3.1


    【解决方案1】:

    (String BaseUrl, String Route) 实际上是一个结构体ValueTuple&lt;T1,T2&gt;,所以它是按值传递给你的options 动作的,不能这样更新:

    public void Update((String BaseUrl, String Route) x)
    {
        x.BaseUrl = "https://locahost:80";
        x.Route = "/sitemap.xml";
    }
    
    public void Update(ref (String BaseUrl, String Route) x)
    {
        x.BaseUrl = "https://locahost:80";
        x.Route = "/sitemap.xml";
    }
    
    
    Update(sitemapOptions);
    Console.WriteLine(sitemapOptions); // prints "(, /sitemap)"
    
    Update(ref sitemapOptions);
    Console.WriteLine(sitemapOptions); // prints "(https://locahost:80, /sitemap.xml)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多