在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
似乎他们为新版本修复了它。
答案 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,但这只是猜测...)