问题描述
我在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)"