2014-09-22 3 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#에서 나는 내가 DotLiquid에 내가 이름 요소 (COL)를 통해 액세스 할 수이

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

[ "행"]와 같은 요소에 액세스 할 수 MyCollection 클래스의 인스턴스를 생성하는 경우 주형? 그렇다면 어떻게 구현합니까?

답변

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) })); 

액세스를 당신의 템플릿은 다음 method 인수로 MyCollectionDrop.BeforeMethod에 그대로

{{ my_items.rows.name }} 

"행"전달됩니다.

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 변경 : 또는이 같은 MyItemDrop 클래스를 작성

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