0

是否可以通过字符串引用而不是 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 模板中的名称元素 col["Rows"] 访问吗?如果是这样,我该如何实施?

4

1 回答 1

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

“rows”将按原样MyCollectionDrop.BeforeMethod作为method参数传递。

请注意,您还需要 make MyIteminherit from 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]);
}
于 2014-10-12T05:32:02.680 回答