RazorEngine で匿名型のモデルを使用すると、奇妙な動的バインディング エラーが発生します。匿名型は内部であるため、モデルに匿名型がある場合、Razor は動的を使用することを知っています。エラーを再現する簡単なプログラムを次に示します。
void Main()
{
// works fine
var model = (dynamic)new { items = new[] { Create(new { a = 2 }, 1) } };
var items = model.@items;
foreach (var item in items) {
Console.WriteLine(item.Index);
}
RazorEngine.Razor.Compile(@"
@{ var items = Model.@items; }
@foreach (var item in items) { <text>
X @item.Index
</text> } X", new { items = new[] { Create(new { a = 2 }, 1) } }.GetType(), "name");
// parse failes with RuntimeBinderException: 'System.ValueType' does not contain a definition for 'Index'
var parsed = RazorEngine.Razor.Parse(@"
@{ var items = Model.@items; }
@foreach (var item in items) { <text>
X @item.Index
</text> } X", new { items = new[] { Create(new { a = 2 }, 1) } }, "name");
Console.WriteLine(parsed);
}
public struct IndexedValue<T>
{
private readonly T _value;
private readonly int _index;
public IndexedValue(T value, int index)
{
this._index = index;
this._value = value;
}
public T Value { get { return this._value; } }
public int Index { get { return this._index; } }
}
public static IndexedValue<T> Create<T>(T item, int index) { return new IndexedValue<T>(item, index); }
ここで何が起こっているのか誰か説明できますか?