2

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

ここで何が起こっているのか誰か説明できますか?

4

0 に答える 0