使用Invoke

问题描述

我在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没有获得新值。为什么?

解决方法

(String BaseUrl,String Route)实际上是一个结构ValueTuple<T1,T2>,因此它会按值传递给您的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)"