1

我有这个程序

private static void RunUsingILiquidizable()
{
    const string templateString = @"TopInt prop: '{{TopInt}}'; Child.Prop prop: '{{L1Prop.L1Int}}'; Child.Child.Prop prop: '{{L1Prop.L2Prop.L2Int}}'; Dict item: '{{ExtendedProps.Key1}}'";
    Template.NamingConvention = new CSharpNamingConvention();
    Template.RegisterValueTypeTransformer(typeof(DateTime), (v) => ((DateTime)v).ToString("MM=dd=yy"));
    var t = Template.Parse(templateString);

    var model = new TopModel()
    {
        TopInt = 23,
        L1Prop = new L1Model()
        {
            L1Int = 34,
            L2Prop = new L2Model() { L2Int = 98 }
        },
        ExtendedProps = new Dictionary<string, object>() { { "Key1", DateTime.Now } }
    };

    string output = t.Render(Hash.FromAnonymousObject(model));

    Console.WriteLine("RunUsingILiquidizable -->" + output);

}

顶级模型定义:

public class TopModel : ILiquidizable
{
    public int TopInt { get; set; }
    public L1Model L1Prop { get; set; }
    public Dictionary<string, object> ExtendedProps { get; set; }
    public object ToLiquid()
    {
        return new { TopInt, L1Prop, ExtendedProps };
    }
}

输出:

RunUsingILiquidizable --> TopInt prop: '23'; Child.Prop 道具:'34'; Child.Child.P 道具:'98'; 字典项目:'08=27=19'

我的问题是 -Template.RegisterValueTypeTransformer全局类型格式和template.Render(Hash.FromAnonymousObject(model), MyFormatProvider)所有日期、数字的格式是否相同。

我需要的是通过提供格式在需要时对每个特定令牌进行不同的格式化。对字典尤其重要ExtendedProps

我也尝试做过滤器,但有没有办法通过类似的东西{{ExtendedProps.Key1 | SpecialFormat("dd--MM")}}

4

1 回答 1

1

我鼓励您检查StandardFilters该类的源代码。自定义过滤器可以做的比 wiki 文档让您相信的更多,标准过滤器展示了其中的大部分内容。如果您已经看到标准过滤器所做的某些事情,您可以编写一个执行相同操作的自定义过滤器。

这是一个示例custom_date过滤器:

public static class CustomFilter
{
    public static string CustomDate(Context context, object input, string format = null, string culture = null)
    {
        if (input is DateTime dt)
        {
            IFormatProvider formatProvider = !string.IsNullOrEmpty(culture)
                ? CultureInfo.GetCultureInfo(culture)
                : context.FormatProvider;

            return dt.ToString(format, formatProvider);
        }

        return null;
    }
}

兴趣点:

  1. 它接受一个初始Context参数,其中包括一个FormatProvider类型的属性IFormatProviderCultureInfo实现)。如果你需要它的东西,你只需要包含这个参数。

  2. 它接受多个参数:

    一个。一种格式,就像某些ToString重载一样,只是通过它。

    湾。为其检索CultureInfoor 的语言环境,如果nullor "",则默认为 context.FormatProvider,这是IFormatProvider传递给的可选区域Render或当前区域性。

  3. 参数为默认值。一般来说,这可能是一个好主意,因为没有办法在模板中使它们成为必需的。

示例用法

Template.Register(typeof(CustomFilter));

CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
var template = Template.Parse("Today is {{ today | custom_date: 'd' }} (current culture), {{ today | custom_date: 'd', 'fr-CA' }} (fr-CA), and {{ today | custom_date: 'd', elsewhere }} ({{ elsewhere }}).");
string output = template.Render(Hash.FromAnonymousObject(new { today = DateTime.Today, elsewhere = "de-DE" }));

输出

今天是 8/30/2019(当前文化)、2019-08-30(fr-CA)和 30.08.2019(de-DE)。

更多兴趣点:

  1. 参数在冒号后指定,如果有多个参数,则用逗号分隔。

  2. 您传递给的“哈希”中的值Render可以在您传递的参数中引用(例如elsewhere)。

  3. 标准格式对"d"区域性很敏感,因此您可以看到当前区域性 ( en-US)、硬编码区域性 ( fr-CA) 和参数化区域性 ( de-DE) 都可以如何使用。

于 2019-08-30T07:52:41.787 回答