'object'在同一个程序集中不包含'...'的定义

时间:2015-04-20 18:07:36

标签: c# dynamic

根据我老板的建议,我们正在使用Dapper访问我们的数据库。由于这只是一个快速的,一次性的项目,他想放弃为这些数据库调用的结果创建POCO对象,所以我们只是让Dapper返回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>();
    }
}

我们能够在获取结果并将其作为参数传递给Ok()返回值时成功使用它。对象的所有属性都被成功解析为JSON对象。

我现在正在处理代码的另一部分,而不是立即将其吐出,我需要使用返回的数据来实现另一组功能。

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'不包含'Id'

的定义

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

我已经checked several questions了,即使他们都在处理匿名对象(我可以理解dynamic在该标题下),我是保持在同一个程序集中,所以关于匿名对象被声明为“内部”的那些点在这种情况下不适用。

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

修改 下面是它如何被调用的屏幕截图,以及它包含的对象和属性。也许这些属性的格式可以帮助确定为什么它没有找到。

run time evaluation of the dynamic object

我还使用Watch菜单尝试了各种方法来访问该属性,并且以下都没有工作:

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

以下是运行时来自即时窗口的dbSurvey.GetType()的结果:

{<>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]]"}

1 个答案:

答案 0 :(得分:0)

好的,所以我解决了这个问题。我只知道问题是什么。感谢xanatos&#39;在评论中提示,我们注意到该类型的Module属性来自测试工具。那对我来说没有任何意义,因为动态对象是在同一个程序集中创建的。

然而,在我今天早上回到这个问题之前,我没有想到的是,对象的来源是&#34;创建&#34;在基础API控制器中是我在测试工具中创建的匿名对象。所以Module是正确的。

如果我在Test DLL中为Mock对象创建了一个单独的POCO对象,那么它就不再创建一个在另一个程序集中创建的匿名对象的dynamic