Ok, here's how I did it.
I added a checkbox field onto /sitecore/templates/System/Layout/Sections/Caching
called "VaryByMyCustomThing".
Then I replaced the "GenerateCacheKey" pipeline in the Sitecore.Mvc.config with a custom implementation. I replaced this:
<processor type="Sitecore.Mvc.Pipelines.Response.RenderRendering.GenerateCacheKey, Sitecore.Mvc"/>
With this:
<processor type="My.Site.Pipelines.GenerateCustomCacheKey, My.Site"/>
My GenerateCustomCacheKey class looks like this:
using System.Net.Http;
using System.Web;
using Sitecore.Mvc.Extensions;
using Sitecore.Mvc.Pipelines.Response.RenderRendering;
using Sitecore.Mvc.Presentation;
namespace My.Site.Pipelines
{
public class GenerateCustomCacheKey : GenerateCacheKey
{
protected override string GenerateKey(Rendering rendering, RenderRenderingArgs args)
{
var varyByCountryCode = rendering.RenderingItem.InnerItem["VaryByMyCustomThing"].ToBool();
var key = base.GenerateKey(rendering, args);
if (varyByCountryCode)
key = key + GetCountryCodePart(rendering);
return key;
}
protected string GetCountryCodePart(Rendering rendering)
{
return "_#countryCode:" + (string)HttpContext.Current.Session["CountryCode"];
}
}
}