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

Dynamic 将动态属性传递给内部构造函数,dynamic,constructor,c#-4.0,internal,Dynamic,Constructor,C# 4.0,Internal,在C#4.0b中使用动态参数调用内部构造函数会导致以下异常 System.ArgumentNullException:值 不能为空。参数名称: 建造师 示例代码(感谢Jon Skeet) 看起来运行库在选择正确的构造函数时不考虑内部构造函数。这似乎是一个bug,因此我将其发布在Connect上: 似乎他们为新版本修复了它。如果没有看到代码,我建议您将非实例化类传递给构造函数。在将它们传递给非动态对象之前,请确保它们在范围内并已实例化(例如通过使用new) 编辑 看到您的代码后,我建议您使用Dy

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

System.ArgumentNullException:值 不能为空。参数名称: 建造师

示例代码(感谢Jon Skeet)

<>看起来运行库在选择正确的构造函数时不考虑内部构造函数。这似乎是一个bug,因此我将其发布在Connect上:


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

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

编辑

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

看到Jon的答案后编辑

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

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

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


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

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

下面是一个非常简短但完整的示例,演示了问题:

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

    static void Main()
    {
        dynamic d = "";
        new Test(d);
    }
}
我建议您登录-然后在此处发布URL,我们可以对其进行投票:)


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

如果没有看到任何代码,很难说您做错了什么。请给出一个简短但完整的示例。@Rik-在看到您的代码后,您已经调整了我的答案。尝试对实体属性而不是动态属性使用DynamicObject。您的意思是在helper类中?那没什么区别。或者您有其他原因选择静态类型吗?@Rik-我认为这是因为当您开始使用动态类实例时,它不再在范围内。@Rik-如果这在您的系统上不起作用,您确定安装了C#4.0吗?由于此功能仅在该版本中引入。我正在努力修改此代码,使其以与我自己的代码相同的方式失败。我预计我会这样回答我自己的问题:)是的,我有C#4.0:)@Chris:没有C#4.0和.NET 4.0,我认为Rik不会有执行时间例外:)@Rik:是的,我想你会的。这是提出一个简短但完整的例子的一大好处——它善于发现问题。我把它打破了,看问题。然而,我似乎更多地是通过使用内部类和访问修饰符,而不是通过使用动力学。生成了一个更短的示例-根本不需要自定义动态对象等。
public class Test
{
    internal Test(string x)
    {
    }

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