2014-09-22 4 views
0

Возможно ли получить доступ к элементу коллекции с помощью ссылки на строку вместо смещения индекса для DotLiquid?DotLiquid - доступ к элементу коллекции посредством индексатора строк?

public class MyItem 
{ 
    public string Name; 
    public object Value; 

    public MyItem(string Name, object Value) 
    { 
     this.Name = Name; 
     this.Value = Value; 
    } 
} 

    public class MyCollection : List<MyItem> 
{ 
    public MyCollection() 
    { 
     this.Add(new MyItem("Rows", 10)); 
     this.Add(new MyItem("Cols", 20)); 
    } 

    public MyItem this[string name] 
    { 
     get 
     { 
      return this.Find(m => m.Name == name); 
     } 
    } 
} 

Таким образом, в нормальной C# если я создаю экземпляр класса MyCollection я могу получить доступ к элементам, как этот

MyCollection col =new MyCollection(); 
col[1] or col["Rows"] 

Могу ли я получить доступ через имя элемента цв [ «Ряды»] в DotLiquid шаблон? Если да, то как это реализовать?

ответ

0

Да, это возможно. Во-первых, определить Drop класс как это:

public class MyCollectionDrop : Drop 
{ 
    private readonly MyCollection _items; 

    public MyCollectionDrop(MyCollection items) 
    { 
    _items = items; 
    } 

    public override object BeforeMethod(string method) 
    { 
    return _items[method]; 
    } 
} 

Затем в коде, который делает ваш шаблон, добавить его экземпляр в контексте:

template.Render(Hash.FromAnonymousObject(new { my_items = new MyCollectionDrop(myCollection) })); 

Наконец, доступ к его, как это в вашем шаблон:

{{ my_items.rows.name }} 

«строка» будет передана как есть в MyCollectionDrop.BeforeMethod как method аргументе.

Обратите внимание, что для получения доступа к его объектам также необходимо ввести MyItem inherit из Drop. Или написать MyItemDrop класс как это:

public class MyItemDrop : Drop 
{ 
    private readonly MyItem _item; 

    public MyItemDrop(MyItem item) 
    { 
    _item = item; 
    } 

    public string Name 
    { 
    get { return _item.Name; } 
    } 

    public string Value 
    { 
    get { return _item.Value; } 
    } 
} 

, а затем изменить MyCollectionDrop.BeforeMethod к этому:

public override object BeforeMethod(string method) 
{ 
    return new MyItemDrop(_items[method]); 
}