Почему я получаю RuntimeBinderException при возврате динамического? - PullRequest
1 голос
/ 10 сентября 2011

Я использую Massive и у меня есть таблица членов.В моем классе Members у меня есть метод 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;
        }
}

В строке с вкладками, которая читает var member = members.Find(email); thisвозвращает исключение RuntimeBinderException при попытке доступа к member.Member.Id.Я вхожу в код, и метод Find «возвращает» правильные данные, но они не передаются члену переменной.Странно, когда я использую код для извлечения пользователя в строке ниже:

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

Работает нормально.Не очень хорошо, чтобы держать вещи СУХОЙ, хотя.Что происходит и есть ли способ использовать метод Find из моего класса Members внутри моего класса Addresses?

Lloyd

1 Ответ

2 голосов
/ 11 сентября 2011

Это потому, что вы возвращаете result из Find, то есть ExpandoObject.Для доступа к Member в Addresses необходимо изменить код на:

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