c#不同解决方案的动态行为不同

本文关键字:动态 解决方案 | 更新日期: 2023-09-27 18:21:12

我有一个非常奇怪的问题。如果我创建了一个新的控制台应用程序并将代码放入,下面的代码会很好地工作,但如果我在解决方案中创建一个新控制台应用程序,并在中粘贴完全相同的代码,我会得到一个运行时绑定器异常,即动态不包含hello的定义。更糟糕的是,在我现有的解决方案中,代码从未进入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);
        }
    }
}

c#不同解决方案的动态行为不同

听起来你有visualstudio设置来打破抛出的异常。在处理包括动态对象在内的C#对象时,仅使用Dynamics就会抛出和处理比您想象的更多的异常。C#绑定器总是尝试先调用静态版本等操作,然后抛出一个无法找到成员的RuntimeBindingException,对其进行处理,然后重试动态版本。

Debug > Exceptions下,确保未在RuntimeBinderException上检查Thrown,甚至仅检查所有CLR异常。