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