현재 프로젝트를 진행 중이고 템플릿 자체에서 Enum을 사용해야하는 경우가 있습니다. DotLiquid 템플릿 내에서 열거 형에 액세스 할 수 있도록 다음 클래스를 만들었습니다.SafeType의 블록이 작동하지 않는 경우
/// <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 Container에 의해 호출되며 "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