Словари и DotLiquid

У меня есть базовый словарь.NET (словарь). В моем методе ToLiquid я действительно сериализую / выставляю объект Dictionary. Мой вопрос заключается в том, как я могу СОДЕРЖАТЬ ключи в жидком шаблоне, как вы это делаете в обычном.NET? Кажется, что вы ДОЛЖНЫ знать фактический ключ, чтобы получить доступ к значению в жидком шаблоне.

Я понимаю, что вы можете получить доступ к значению в жидком шаблоне, как такой

item.dictionary["MYKEY"]

Однако я не знаю фактический ключ, поэтому я бы предпочел использовать конструкцию "for" в DotLiquid для перебора ключей для получения различных значений. Поскольку конструкция "for" работает с коллекциями, а Dictionary - это коллекция, я подумал, что это можно как-то сделать, но все попытки, которые я пробовал, потерпели неудачу.

Любая помощь будет принята с благодарностью.

2 ответа

Если вам нужен только доступ к значениям в словаре, вы можете сделать это:

[Test]
public void TestForWithDictionary()
{
    var dictionary = new Dictionary<string, string>
    {
        { "Graham Greene", "English" },
        { "F. Scott Fitzgerald", "American" }
    };
    Helper.AssertTemplateResult(" English  American ", "{% for item in authors %} {{ item }} {% endfor %}",
        Hash.FromAnonymousObject(new { authors = dictionary.Values }));
}

Однако, если вам действительно нужен доступ к ключам и значениям внутри for цикл, то это не поддерживается текущей версией (1.6.1) DotLiquid.

Просто создайте каплю для объекта словаря. Тогда используйте это, чтобы обернуть своих участников, которые являются словарями в Ваших каплях. IE:

public class MyDictionaryDrop : Drop
{
    private Dictionary<string,string> _myDictionary;
    public DictionaryDrop<string, string> MyDictionary
    {
        get 
        { 
            return new DictionaryDrop<string, string>(_myDictionary);  
        }
    }
}

public class DictionaryDrop<TKey,TValue> : Drop ,IEnumerable
{
    private readonly Dictionary<TKey, TValue> _dictionary;
    public DictionaryDrop(Dictionary<TKey,TValue> dictionary)
    {
        _dictionary = dictionary;
    }

    public ICollection<TKey> Keys { get { return _dictionary.Keys; } }
    public ICollection<TValue> Values { get { return _dictionary.Values; } }
    public TValue this[TKey key] { get { return _dictionary[key]; } }

    public IEnumerator GetEnumerator()
    {
        return _dictionary.GetEnumerator();
    }
}
Другие вопросы по тегам