代码之家  ›  专栏  ›  技术社区  ›  Rik elirevach

将动态属性传递给内部构造函数

  •  1
  • Rik elirevach  · 技术社区  · 17 年前

    在C#4.0b中使用动态参数调用内部构造函数会导致以下异常

    System.ArgumentNullException:值 建造师

    示例代码(感谢Jon Skeet)

    public class Test
    {
        internal Test(string x)
        {
        }
    
        static void Main()
        {
            dynamic d = "";
            new Test(d);
        }
    }
    

    似乎运行库在试图选择正确的内部构造函数时不考虑内部构造函数。这似乎是一个bug,因此我将其发布在Connect上: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=472924

    看来他们为新版本修好了。

    2 回复  |  直到 17 年前
        1
  •  1
  •   ChrisBD    17 年前

    在没有看到代码的情况下,我建议您将非实例化类传递给构造函数。在将它们传递给非动态对象之前,请确保它们在范围内并已实例化(例如通过使用new)。

    编辑

    看到您的代码后,我建议您使用DynamicObject而不是dynamic作为助手的构造函数和实体属性。

    看到乔恩的答案后编辑

    我认为问题在于使用GetEntity()方法生成动态对象实例。

    我注意到Jon在使用MyDynamicObject的同一范围内创建了MyDynamicObject的实例。

    我假设您正在GetEntity()方法中生成对象的一个实例,在这种情况下,当您使用它时,它不再在范围内,被归类为本地对象。

    使用“MyDynamicObject e=entity;”将强制编译器非法使用MyDynamicObject构造函数并将结果映射到它。因此,在将地址空间传递给帮助器构造函数时,地址空间已经分配并在要使用的范围内。

        2
  •  1
  •   Jon Skeet    17 年前

    编辑:好的,我现在更进一步地跟踪了它——它使用了一个内部构造函数,导致了一个问题。

    这里有一个 真正地 演示问题的简短但完整的示例:

    public class Test
    {
        internal Test(string x)
        {
        }
    
        static void Main()
        {
            dynamic d = "";
            new Test(d);
        }
    }
    

    Connect -然后在这里发布URL,我们可以对其进行投票:)

    (我猜在DLR中有一个对GetConstructor的调用,但没有相应的BindingFlags.NonPublic,但这只是一个猜测…)