Вам необходимо установить 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"));
}
Я признаю, что это что-то вроде ошибки - это не первый раз, когда эта проблема была поднята. Я еще не нашел удовлетворительного решения, но любые предложения приветствуются.