【问题标题】:c# Dynamic behaving differently from one solution to anotherc#动态行为从一种解决方案到另一种解决方案不同
【发布时间】:2012-02-15 15:43:02
【问题描述】:

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

【问题讨论】:

  • 这应该可以,检查是否在您的代码中正确添加到字典中的值
  • 它确实在解决方案之外工作,但不是在其中? - 将工作项目导入解决方案使其无法正常工作
  • DynamicObject 是你在实际代码中使用的类型吗?发生这种情况的主要时间是内部成员的可访问性......
  • 是的,它完全一样,只是不调用 MyDynamicModel - 我认为这是一个内部问题,为什么我创建这个动态模型,它接受动态(IDictionary)以将这些成员公开给除它是在其中创建的。但是,它们在示例中位于同一个程序集中,但仍然无法正常工作!
  • 在 Visual Studio 之外(即不调试它)它可以工作!

标签: c# c#-4.0 reflection dynamic reference


【解决方案1】:

听起来你有 Visual Studio 设置来打破抛出的异常。在处理包括动态对象在内的 C# 对象时,仅使用 Dynamics 就会抛出和处理更多的异常。 C# binder 总是尝试先调用静态版本等,然后抛出找不到成员的 RuntimeBindingException,对其进行处理,然后再次尝试动态版本。

Debug &gt; Exceptions 下确保Thrown 未检查 RuntimeBinderException 甚至所有 CLR 异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    相关资源
    最近更新 更多