Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:动态变量未按预期绑定_C#_Entity Framework_Dynamic - Fatal编程技术网

C#:动态变量未按预期绑定

C#:动态变量未按预期绑定,c#,entity-framework,dynamic,C#,Entity Framework,Dynamic,我的数据库中有一个实体,它有一个对应的“历史”实体。两个实体持有的数据基本相同;“历史记录”表用于跟踪此数据随时间的变化,主表仅包含最新数据 在我的C#代码中有一些地方,我需要访问一个属性,该属性可能来自主实体的实例或“历史”实体。例如,两个实体都有一个“SalesPrice”属性,我希望能够使用该属性编写单个语句,该属性将适用于任一实体类型 C#“dynamic”关键字似乎应该启用此功能。例如,如果我们假设MethodWithDynamicReturnType()被声明为返回动态,并且在运行时

我的数据库中有一个实体,它有一个对应的“历史”实体。两个实体持有的数据基本相同;“历史记录”表用于跟踪此数据随时间的变化,主表仅包含最新数据

在我的C#代码中有一些地方,我需要访问一个属性,该属性可能来自主实体的实例或“历史”实体。例如,两个实体都有一个“SalesPrice”属性,我希望能够使用该属性编写单个语句,该属性将适用于任一实体类型

C#“dynamic”关键字似乎应该启用此功能。例如,如果我们假设MethodWithDynamicReturnType()被声明为返回动态,并且在运行时将返回主实体或历史实体的实例,那么我希望能够编写如下代码:

 dynamic d;
 d=MethodWithDynamicReturnType();
 Console.WriteLine(d.SalesPrice.ToString());
但我遇到了一个异常(“无法对空引用执行运行时绑定”)。因此,我试图使运行时的内容更加明确:

 Main_Entity m;
 History_Entity h;
 MethodThatWillFillOneOutParameterOnly(out m, out h);
 dynamic d;
 if(h!=null){d=h;}else{d=m;}
 Console.WriteLine(d.SalesPrice.ToString());
这并没有阻止异常。有趣的是,如果我将变量“d”强制转换为“Main_Entity”或“History_Entity”,那么我的代码可以正常工作。。。但避免这一点难道不是“动态”的全部意义吗


要么我完全错误地理解了“动态”,要么,在寻找其他解释时,实体框架可能有错吗?我注意到我分配给“d”的实际运行时值有一个奇怪的“proxy”类名,而不是我希望看到的实际实体类型名。这是否表明存在某种间接方式,使“动态”无法达到预期目的?

发生错误时,您能否确认SalesPrice不为空?是的,GantheWander,SalesPrice不为空。如果它为null,我希望在调用.ToString()时出现一个简单的“null引用异常”,但实际情况并非如此。真奇怪!实际上,如果SalesPrice为null,您仍然会收到一个错误,说
无法对null引用执行运行时绑定
我刚刚自己测试了它,如果您好奇,我可以提供代码您是否使用像NHibernate这样的实体框架?我见过NHibernate为实体创建代理类。如果发生这种情况,房产销售价格有可能不存在同名吗?@Ganthewinder,是的,我很确定你已经接近答案了。我使用的是EF(微软对NHibernate的回答)。在调试器中,代理类肯定拥有所有正确的成员。问题是,我的动态变量在运行时的类型是“object”。在对象创建和我将其分配到“动态”变量之间的某个地方,它将被转换为“对象”,或者以其他方式删除其类型信息。我想一定是EF。