Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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#_Dynamic - Fatal编程技术网

C# ';对象';不包含对';的定义';在同一组件内

C# ';对象';不包含对';的定义';在同一组件内,c#,dynamic,C#,Dynamic,根据我老板的建议,我们正在使用Dapper访问我们的数据库。由于这只是一个快速、一次性的项目,他希望放弃为这些数据库调用的结果创建POCO对象,因此我们只需要使用Dapper returndynamic对象 因此,我有几个Web API控制器,都来自同一个BaseController。在基类中,我们有这样一个方法: protected dynamic ExecuteSingle(string sql, object parameters = null, bool useStoredProcedu

根据我老板的建议,我们正在使用Dapper访问我们的数据库。由于这只是一个快速、一次性的项目,他希望放弃为这些数据库调用的结果创建POCO对象,因此我们只需要使用Dapper return
dynamic
对象

因此,我有几个Web API控制器,都来自同一个BaseController。在基类中,我们有这样一个方法:

protected dynamic ExecuteSingle(string sql, object parameters = null, bool useStoredProcedure = true) {
    using (var db = ObjectFactory.GetInstance<IDbManager>())
    {
        var cmd = useStoredProcedure ? db.SetSpCommand(sql) : db.SetCommand(sql);

        if (parameters != null)
        {
            cmd = cmd.SetParameters(parameters);
        }

        return cmd.ExecuteObject<dynamic>();
    }
}
然后,它在调用
dbSurvey.Id
的最后一行失败,异常是

“对象”不包含“Id”的定义

检查对象时,其中有一个名为“Id”的属性

我已经这样做了,即使它们都在处理匿名对象(我可以理解
动态
在这个标题下),我仍然在同一个程序集中,所以关于匿名对象被声明为“内部”的观点在这种情况下不适用

我还尝试将
ExecuteSingle
的返回类型更改为
ExpandoObject
,但得到了相同的结果

编辑 下面是如何调用它的屏幕截图,以及它所包含的对象和属性。也许属性的格式可以帮助确定为什么找不到它

我还使用“监视”菜单尝试各种方式访问该属性,但以下操作均无效:

dbSurvey["Id"]
(dbSurvey as IDictionary<string, long>)["Id"]
((IDictionary<string, int>)dbSurvey)["Id"]

好的,我解决了这个问题。我刚弄明白问题出在哪里。感谢xanatos在评论中的帮助,我们注意到类型的
模块
属性来自测试线束。这在当时对我来说没有任何意义,因为动态对象是在同一个程序集中创建的

然而,直到今天早上我回到问题上来,我才想到的是,在基本API控制器中“创建”的对象的源是我在测试工具中创建的匿名对象。因此,
模块
是正确的


如果我在测试DLL中为模拟对象创建了一个单独的POCO对象,那么它就不再从另一个程序集中创建的匿名对象中创建
动态

这种方法存在许多问题。1,所有逻辑现在将在控制器中进行,而不是在正确隔离的DAL中进行。2、对象返回之前的任何变换也会发生在控制器中,更不用说现在真的不可管理了3、由于dynamic,每次调用都会受到小的性能影响。4.没有一次性的项目。一些可怜的灵魂最终会支持它。那么,最后,POCOs的危害又是什么呢?项目经理非常清楚所有这些。在我们编写代码的人能够在最初的设计会议上提出问题之前,他驳斥了所有这些问题。
dbSurvey.GetType().GetProperty(“Id”)
返回了什么还是空?@krillgar使用
dbSurvey.GetType()
。我认为动态物体是可疑的。。。您告诉我们您正在使用Dapper,但是
IDbManager
SetSpCommand
ExecuteObject
并不是“基本”Dapper(我现在正在查看Dapper.dll),因为您花了很多时间试图一起破解它,您可能已经创建并使用了所需的对象。另外,尝试使用dbSurvey本身,而不是dbSurvey.Id。或者,dbSurvey[0]。
dbSurvey["Id"]
(dbSurvey as IDictionary<string, long>)["Id"]
((IDictionary<string, int>)dbSurvey)["Id"]
{<>f__AnonymousType2`1[System.Int64]}
base: {Name = "<>f__AnonymousType2`1" FullName = "<>f__AnonymousType2`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}
Assembly: {***.Web.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null}
AssemblyQualifiedName: "<>f__AnonymousType2`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], ***.Web.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
BaseType: {Name = "Object" FullName = "System.Object"}
ContainsGenericParameters: false
DeclaringMethod: 'dbSurvey.GetType().DeclaringMethod' threw an exception of type 'System.InvalidOperationException'
DeclaringType: null
FullName: "<>f__AnonymousType2`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"
GenericParameterAttributes: 'dbSurvey.GetType().GenericParameterAttributes' threw an exception of type 'System.InvalidOperationException'
GenericParameterPosition: 'dbSurvey.GetType().GenericParameterPosition' threw an exception of type 'System.InvalidOperationException'
GUID: {382c0269-d631-3c89-a105-38a1be8a3db7}
IsConstructedGenericType: true
IsEnum: false
IsGenericParameter: false
IsGenericType: true
IsGenericTypeDefinition: false
IsSecurityCritical: true
IsSecuritySafeCritical: false
IsSecurityTransparent: false
MemberType: TypeInfo
MetadataToken: 33554480
Module: {***.Web.Test.dll}
Name: "<>f__AnonymousType2`1"
Namespace: null
ReflectedType: null
StructLayoutAttribute: {System.Runtime.InteropServices.StructLayoutAttribute}
TypeHandle: {System.RuntimeTypeHandle}
UnderlyingSystemType: {Name = "<>f__AnonymousType2`1" FullName = "<>f__AnonymousType2`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}