【问题标题】:Why am I getting a RuntimeBinderException when returning dynamic?为什么在返回动态时会出现 RuntimeBinderException?
【发布时间】:2011-09-11 09:10:22
【问题描述】:

我正在使用 Massive 并且有一个成员表。在我的成员类中,我有一个通过电子邮件查找成员的 find 方法:

   public class Members : DynamicModel
    {
        public Members(): base("TSConnection", "Members", "Id"){}

        public dynamic Find(string email)
        {
            dynamic result = new ExpandoObject();
            result.Success = false;
            try
            {
                result.Member = this.Single(where: "Email=@0", args: email);
                result.Success = result.Member != null;
            }
            catch (Exception ex)
            {
                result.Message = ex.Message;
            }
            return result;
        }
}

这会按预期返回所有内容,并且在单独的单元测试测试中 result.Member.Id 显示它已填充数据。

在一个单独的类中,地址。我尝试使用此方法检查用户是否存在并检索 Member.Id 以在为特定成员插入地址时使用:

 public class Addresses : DynamicModel
    {
        public Addresses() : base("TS", "Addresses", "Id") { }

        public dynamic Create(string email, string type, string address1, string address2, string city, string state, int countryId, string postcode)
        {
            var members = new Members();
            dynamic result = new ExpandoObject();
            result.Success = false;
            //var member = members.Find(email);

            result.Member = members.Single(where: "Email=@0", args: email);
            dynamic address = new ExpandoObject();

            if (result.Member != null)
            {
                address.Id = this.Insert(new {
                    MemberId = result.Member.Id,  
                    AddressTypeId = (int)AddressType.Account,
                    Address1 = address1,
                    Address2 = address2,
                    City = city,
                    State = state,
                    Country = countryId,
                    Postcode = postcode
                });
                result.Address = address.Id != 0 ? address : null;
                result.Success = address.Id != 0;
            }
            return result;
        }
}

当我尝试访问member.Member.Id 时,在显示为var member = members.Find(email); 的选项卡式行上,这将返回一个RuntimeBinderException。我进入代码,Find 方法正在“返回”正确的数据,但它没有被传递给变量成员。奇怪的是,当我使用代码在下面的行中检索用户时:

result.Member = members.Single(where: "Email=@0", args: email);

它工作正常。不过,这对于保持干燥并不是很好。发生了什么,有没有办法可以在 Addresses 类中使用 Members 类中的 Find 方法?

劳埃德

【问题讨论】:

    标签: asp.net dynamic massive


    【解决方案1】:

    这是因为您从Find 返回result,这是一个ExpandoObject。要访问Addresses 中的Member,您需要将代码更改为:

    var members = new Members();
    var result = members.Find(email);
    var member = result.Member;
    

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多