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

时间:2009-07-06 14:48:54

标签: dynamic constructor c#-4.0 internal

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

  

System.ArgumentNullException:Value   不能为空。参数名称:   构造

示例代码(感谢Jon Skeet)

public class Test
{
    internal Test(string x)
    {
    }

    static void Main()
    {
        dynamic d = "";
        new Test(d);
    }
}

似乎运行时在尝试选择正确的构造函数时不考虑内部构造函数。这似乎是一个错误,所以我在Connect上发布了它: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=472924

似乎他们为新版本修复了它。

2 个答案:

答案 0 :(得分:1)

如果没有看到代码,我会建议您将非实例化的类传递给构造函数。确保它们在范围内并且已经实例化,例如在将它们传递给非动态对象之前,使用new。

修改

在看到你的代码时,我建议你使用DynamicObject而不是动态的helper costructor和Entity属性。

看到Jon的回答后编辑

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

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

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

使用“MyDynamicObject e = entity;”将强制编译器隐式使用MyDynamicObject构造函数并将结果映射到它。因此,地址空间已经分配,​​并且在将其传递给Helper构造函数时可以使用。

答案 1 :(得分:1)

编辑:好的,我现在已经进一步跟踪了它 - 它正在使用导致问题的内部构造函数。

这是一个真正的简短但完整的例子来说明问题:

public class Test
{
    internal Test(string x)
    {
    }

    static void Main()
    {
        dynamic d = "";
        new Test(d);
    }
}

我建议您使用Connect进行记录 - 然后在此处发布网址,我们就可以对其进行投票:)

(我的猜测是在DLR内部调用GetConstructor而没有相应的BindingFlags.NonPublic,但这只是猜测...)