5

DotLiquidテンプレートエンジンを使用していて、テンプレートの辞書値にアクセスしようとしています。私はこのドロップをテンプレートに渡しました:

public class SomeDrop : Drop
{
   public Dictionary<string, object> MyDictionary {get; set;}
}

var someDropInstance = SomeDrop 
{
   MyDictionary = new Dictionary<string, object> {{"myKey", 1}}
}

Template.NamingConvention = new CSharpNamingConvention();

var preparedTemplate = Template.Parse(template);
var templateOutput = preparedTemplate.Render(Hash.FromAnonymousObject(new { @this = someDropInstance }));

テンプレートでは、myKey値にアクセスできません {{ this.MyDictionary.myKey }}{{ this.MyDictionary['myKey'] }}

4

2 に答える 2

8

Template.NamingConventionドロップオブジェクトを作成する前に設定する必要があります。パフォーマンス上の理由から、基本Dropコンストラクターは、現在の命名規則を使用してすべてのパブリックインスタンスメンバーをキャッシュします。その後、命名規則を変更しても、それらのキャッシュされたプロパティはリセットされません。

このコードは私のために働きます:

public class SomeDrop : Drop
{
    public Dictionary<string, object> MyDictionary { get; set; }
}

[Test]
public void StackOverflow()
{
    Template.NamingConvention = new CSharpNamingConvention();
    const string template = "{{ this.MyDictionary.myKey }}";

    var someDropInstance = new SomeDrop
    {
        MyDictionary = new Dictionary<string, object> { { "myKey", 1 } }
    };

    var preparedTemplate = Template.Parse(template);
    Assert.That(
        preparedTemplate.Render(Hash.FromAnonymousObject(new { @this = someDropInstance })),
        Is.EqualTo("1"));
}

私はこれがちょっとした落とし穴であることを認めます-この問題が提起されたのはこれが初めてではありません。私はまだ満足のいく解決策を思い付いていませんが、どんな提案も歓迎します。

于 2011-11-16T17:54:21.147 に答える
0

MyDictionary["myKey"]またはのようにアクセスするだけですMyDictionary.TryGetValue("myKey", out result)。余分なものはありません{{ }}

于 2011-11-16T15:22:10.820 に答える