C# 如果安全类型上的块不工作

C# 如果安全类型上的块不工作,c#,if-statement,enums,dotliquid,C#,If Statement,Enums,Dotliquid,我目前正在从事一个项目,我们有一些需要,我们需要在模板本身中使用枚举。我创建了以下类,以允许我访问DotLiquid模板中的枚举 /// <summary> /// Liquid Component created to provide support for specified Enumerations. /// </summary> public class EnumSupportComponent : ILiquidComponent { private r

我目前正在从事一个项目,我们有一些需要,我们需要在模板本身中使用枚举。我创建了以下类,以允许我访问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));
            }
        }

    }
}
//
///创建液体组件以支持指定的枚举。
/// 
公共类EnumSupportComponent:ILiquidComponent
{
私有只读静态类型[]枚举类型=
{
类型(交货类型),
类型(消息格式),
类型(订单方法),
类型(付款方式)
};
公开作废登记册()
{
foreach(枚举类型中的类型)
{
RegisterSafeType(type,LocalizeEnum);
}
}
/// 
///本地化枚举。
/// 
///要本地化的对象(枚举成员)。
/// 
私有静态对象LocalizeEnum(对象o)
{
var objType=o.GetType();
var value=LocalizationHelper.GetLocalizedValue(o,objType);
返回值;
}
/// 
///将变量映射到正确的位置。
/// 
/// 
公共静态void映射变量(RenderParameters参数)
{
foreach(EnumTypes中的类型enumType)
{
var members=enumType.GetEnumValues();
foreach(成员中的var成员)
{
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>

交易状态:
{%if Model.PaymentMethod==PaymentMethod.Online%}
{{Model.TransactionStatus}
{%else%}
不适用
{%endif%}
我没有办法解决这个问题。我认为{Model.PaymentMethod}}在那一点上会被解释为字符串,但事实并非如此。我删除了本地化以仅拥有枚举本身,但行为是相同的(事实上,枚举不再本地化)。在这种情况下,我希望避免创建新块来测试相等性。我在网上搜索,但似乎没有答案


我还在官方论坛上发布了这个问题:

问题可能出在
MapVariables

var key = String.Format("{0}.{1}", enumType.Name, member);
parameters.LocalVariables.Add(key, LocalizeEnum(member));
我不认为添加一个带有“.”的键会像您期望的那样工作(并且它可能会抛出一个异常)。另外,
member
不是一个整数吗,所以
key
不会变成类似于
PaymentMethod.0

你可以试试这个:

foreach (Type enumType in EnumTypes)
{
    var members = enumType.GetEnumValues();
    var enumWrapper = new Dictionary<string, object>();

    foreach (var member in members)
        valueWrapper.Add(enumType.GetEnumName(member), member);

    parameters.LocalVariables.Add(enumType.Name, enumWrapper);
}
foreach(EnumTypes中的类型enumType)
{
var members=enumType.GetEnumValues();
var enumWrapper=新字典();
foreach(成员中的var成员)
valueWrapper.Add(enumType.GetEnumName(成员),成员);
parameters.LocalVariables.Add(enumType.Name,enumWrapper);
}
(我忽略了本地化枚举,因为我不知道它是返回字符串还是整数。)

您可以在渲染之前使用调试器检查
parameters.LocalVariables
中的内容,并验证它是否符合预期