c # Динамическое поведение по-разному от одного решения к другому - PullRequest
0 голосов
/ 21 января 2012

У меня действительно странная проблема. Приведенный ниже код работает нормально, если я создаю новое консольное приложение и вставляю код, но если я создаю новое консольное приложение в своем решении и вставляю точно такой же код, я получаю исключение связывателя во время выполнения, которое в динамике не содержит определения для Привет. В моем существующем решении странные вещи, код никогда не входит в TryGetMember ().

Это действительно беспокоит меня, и решение слишком велико, чтобы перейти к новому решению, и я не уверен, что это будет исправлено. В консольном приложении, которое не работает, все ссылки такие же, как и в том, который работает. единственная разница в том, что это не в решении. В целом решение работает аналогично с динамикой - забавно то, что это сработало, но внезапно остановилось, поэтому я создаю эту простую программу для проверки теории.

Редактировать: приложение, которое не работает в решении, работает нормально, если я не присоединяю отладчик, т.е. Ctrl + F5.

Есть идеи?

    using System.Collections;
using System.Collections.Generic;
using System.Dynamic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            IDictionary<string, object> dictionary = new Dictionary<string, object>();
            dictionary["hello"] = "world";
            dynamic d = new MyDynamicModel(dictionary);
            var a = d.hello;
        }

    }

    public class MyDynamicModel : DynamicObject
    {
        private IDictionary<string, object> Values { get; set; }
        public MyDynamicModel(IDictionary<string, object> dict)
        {
            Values = dict;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            return Values.TryGetValue(binder.Name, out result);
        }
    }
}

1 Ответ

0 голосов
/ 23 января 2012

Звучит так, как будто у вас есть визуальная студийная установка, чтобы разбить выброшенные исключения.Простое использование Dynamics создаст и обработает больше исключений, чем вы думаете при работе с объектами C #, включая динамические объекты.Механизм связывания C # всегда пытается выполнить такие вещи, как сначала вызов статической версии и т. Д., А затем выдает исключение RuntimeBindingException, которое не может найти член, обрабатывает его и пытается снова выполнить динамическую версию.

Под Debug > Exceptions убедитесь, что Thrown не проверено на RuntimeBinderException или даже только на всех исключениях CLR.

...