'object' 在同一程序集中不包含“...”的定义
'object' does not contain a definition for '...' within same assembly
根据老板的建议,我们正在使用 Dapper 访问我们的数据库。由于这只是一个快速的一次性项目,他想放弃为这些对数据库的调用结果创建 POCO objects,所以我们只有 Dapper return dynamic
objects.
所以我有几个 Web API 控制器,它们都派生自同一个 BaseController。在基础class中,我们有这样一个方法:
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>();
}
}
我们能够在获取该结果并将其作为参数传递给 Ok()
return 值时成功使用它。 object 的所有属性都成功解析为 JSON object.
我现在正在处理另一部分代码,我需要使用返回的数据来实现另一组功能,而不是立即将其吐出。
var sql = " SELECT Id FROM Table WHERE ReviewId = :ReviewId ";
dynamic dbSurvey = ExecuteSingle(sql, new {ReviewId = reviewId}, false);
var survey = sg.GetSurvey(new GetSurveyRequest(dbSurvey.Id));
然后它在调用 dbSurvey.Id
的最后一行失败,异常说
'object' does not contain a definition for 'Id'
检查 object,那里有一个名为 "Id" 的 属性。
我已经有 checked several questions,即使他们都在处理匿名 object(我可以理解 dynamic
在该标题下),我仍然在相同的程序集,所以那些关于匿名 object 被声明为 "internal" 的观点在这种情况下不适用。
我也尝试将 ExecuteSingle
的 return 类型更改为 ExpandoObject
,但得到的结果相同。
编辑
下面是它如何被调用的屏幕截图,以及它包含的 object 和属性。也许属性的格式可以帮助确定找不到它的原因。
我还使用 Watch 菜单尝试了各种访问 属性 的方法,并且 none 以下方法有效:
dbSurvey["Id"]
(dbSurvey as IDictionary<string, long>)["Id"]
((IDictionary<string, int>)dbSurvey)["Id"]
这里是 dbSurvey.GetType()
的立即数 window 而 运行:
的结果
{<>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]]"}
好的,所以我解决了这个问题。我刚刚弄清楚问题是什么。感谢 xanatos 在评论中的帮助,我们注意到类型的 Module
属性 来自测试工具。当时这对我来说没有任何意义,因为动态对象是在同一个程序集中创建的。
然而,直到今天早上我回到这个问题上,我才想到,在基础 API 控制器中 "created" 对象的来源是一个匿名对象,我在测试工具中创建。所以 Module
是正确的。
如果我在测试 DLL 中为 Mock 对象创建了一个单独的 POCO 对象,那么它就不再从另一个程序集中创建的匿名对象中创建一个 dynamic
。
根据老板的建议,我们正在使用 Dapper 访问我们的数据库。由于这只是一个快速的一次性项目,他想放弃为这些对数据库的调用结果创建 POCO objects,所以我们只有 Dapper return dynamic
objects.
所以我有几个 Web API 控制器,它们都派生自同一个 BaseController。在基础class中,我们有这样一个方法:
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>();
}
}
我们能够在获取该结果并将其作为参数传递给 Ok()
return 值时成功使用它。 object 的所有属性都成功解析为 JSON object.
我现在正在处理另一部分代码,我需要使用返回的数据来实现另一组功能,而不是立即将其吐出。
var sql = " SELECT Id FROM Table WHERE ReviewId = :ReviewId ";
dynamic dbSurvey = ExecuteSingle(sql, new {ReviewId = reviewId}, false);
var survey = sg.GetSurvey(new GetSurveyRequest(dbSurvey.Id));
然后它在调用 dbSurvey.Id
的最后一行失败,异常说
'object' does not contain a definition for 'Id'
检查 object,那里有一个名为 "Id" 的 属性。
我已经有 checked several questions,即使他们都在处理匿名 object(我可以理解 dynamic
在该标题下),我仍然在相同的程序集,所以那些关于匿名 object 被声明为 "internal" 的观点在这种情况下不适用。
我也尝试将 ExecuteSingle
的 return 类型更改为 ExpandoObject
,但得到的结果相同。
编辑 下面是它如何被调用的屏幕截图,以及它包含的 object 和属性。也许属性的格式可以帮助确定找不到它的原因。
我还使用 Watch 菜单尝试了各种访问 属性 的方法,并且 none 以下方法有效:
dbSurvey["Id"]
(dbSurvey as IDictionary<string, long>)["Id"]
((IDictionary<string, int>)dbSurvey)["Id"]
这里是 dbSurvey.GetType()
的立即数 window 而 运行:
{<>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]]"}
好的,所以我解决了这个问题。我刚刚弄清楚问题是什么。感谢 xanatos 在评论中的帮助,我们注意到类型的 Module
属性 来自测试工具。当时这对我来说没有任何意义,因为动态对象是在同一个程序集中创建的。
然而,直到今天早上我回到这个问题上,我才想到,在基础 API 控制器中 "created" 对象的来源是一个匿名对象,我在测试工具中创建。所以 Module
是正确的。
如果我在测试 DLL 中为 Mock 对象创建了一个单独的 POCO 对象,那么它就不再从另一个程序集中创建的匿名对象中创建一个 dynamic
。