私は現在プロジェクトに取り組んでおり、テンプレート自体で列挙型を使用する必要がある特定のニーズがあります。次のクラスを作成して、DotLiquid テンプレート内の列挙型にアクセスできるようにしました。
/// <summary>
/// Liquid Component created to provide support for specified Enumerations.
/// </summary>
public class EnumSupportComponent : ILiquidComponent
{
private readonly static Type[] EnumTypes =
{
typeof(DeliveryType),
typeof(MessageFormat),
typeof(OrderMethod),
typeof(PaymentMethod)
};
public void Register()
{
foreach (Type type in EnumTypes)
{
Template.RegisterSafeType(type, LocalizeEnum);
}
}
/// <summary>
/// Localizes an enum.
/// </summary>
/// <param name="o">Object (enum member) to localize.</param>
/// <returns></returns>
private static object LocalizeEnum(object o)
{
var objType = o.GetType();
var value = LocalizationHelper.GetLocalizedValue(o, objType);
return value;
}
/// <summary>
/// Map the variables to the right spot.
/// </summary>
/// <param name="parameters"></param>
public static void MapVariables(RenderParameters parameters)
{
foreach (Type enumType in EnumTypes)
{
var members = enumType.GetEnumValues();
foreach (var member in members)
{
var key = String.Format("{0}.{1}", enumType.Name, member);
parameters.LocalVariables.Add(key, LocalizeEnum(member));
}
}
}
}
Register メソッドは IoC コンテナーによって呼び出され、「LiquidComponent」は実際に問題なく登録されています。ただし、テンプレートが次のポイントに達すると、常に else ブロックに分類され、その理由がわかりません。エラーはありません。単純に間違った結果です。
<tr>
<th style="text-align: left; padding-right: 10px;">Transaction status:</th>
<td style="padding: 5px 0px;">
{% if Model.PaymentMethod == PaymentMethod.Online %}
{{ Model.TransactionStatus }}
{% else %}
N/A
{% endif %}
</td>
</tr>
私はこれを解決する考えがありません。その時点で {{ Model.PaymentMethod }} は文字列として解釈されると思いましたが、そうではありません。列挙型自体のみを持つようにローカライズを削除しましたが、動作は同じです (列挙型がローカライズされていないという事実があります)。この場合、等価性をテストするために新しいブロックを作成することは避けたいと思います。ネットで調べましたが、答えがないようです。
公式フォーラムにも質問を投稿しました: https://groups.google.com/forum/#!topic/dotliquid/hU4hnOYjCnY