Почему ключевое слово dynamic не работает с динамически загруженными сборками?

Я работаю над оценщиком выражений CSharp, который можно использовать, как вы можете видеть ниже. Этот компонент генерирует код и компилирует его в памяти, после чего загружает сгенерированную сборку, создает экземпляр сгенерированного класса и запускает его. Результаты сохраняются в словаре.

Моя проблема в том, что все они работают нормально до последней строки кода, где происходит сбой с исключением:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException 'объект' не содержит определения для «FirstName».

Однако Visual Studio может показать мне профессиональное содержимое переменных:

Professional = { FirstName = Juan Pablo, 
                LastName = Ibañez, 
                Certifications = <>f__AnonymousType0`3[System.String,System.String,System.String][], 
                SayHi = System.Action }

А это код:

    static void Main(string[] args)
    {
        const string data = @"results[""professional""] = 
        new
        {
            FirstName = ""Juan Pablo"",
            LastName = ""Ibañez"",
            Certifications = new[]
            {
                new { Provider=""MSFT"", ExamCode = ""70-536"", Title = ""TS: Microsoft .NET Framework – Application Development Foundation"" },
                new { Provider=""MSFT"", ExamCode = ""70-505"", Title = ""TS: Microsoft .NET Framework – Application Development Foundation"" },
                new { Provider=""MSFT"", ExamCode = ""70-563"", Title = ""TS: Microsoft .NET Framework – Application Development Foundation"" }
            },

            SayHi = new System.Action(()=> System.Console.WriteLine(""Hi""))
        };";

        var eval = CSharpEvaluator.Evaluate(data); // return a disctionary<string, object>
        dynamic professional = eval["professional"];
        Console.WriteLine("First Name: {0}", professional.FirstName);

Есть идеи?

Спасибо.

14
задан Blorgbeard 21 February 2011 в 16:26
поделиться