Pourquoi est-ce que je reçois une exception RuntimeBinderException lors du retour dynamique?

StackOverflow https://stackoverflow.com/questions/7372462

  •  28-10-2019
  •  | 
  •  

Question

J'utilise Massive et j'ai une table Membres. Dans ma classe Membres, j'ai une méthode de recherche pour trouver un membre par e-mail:

   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;
        }
}

Cela renvoie tout comme prévu et dans un test unitaire séparé, le result.Member.Id montre qu'il est rempli avec les données.

Dans une classe distincte, Adresses. J'essaie d'utiliser cette méthode pour vérifier que l'utilisateur existe et pour récupérer le Member.Id à utiliser lors de l'insertion d'une adresse pour le membre particulier:

 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;
        }
}

Sur la ligne tabulée qui lit var member = members.Find(email);, cela renvoie une exception RuntimeBinderException lorsque j'essaye d'accéder à member.Member.Id. J'entre dans le code et la méthode Find «renvoie» les données correctes mais elles ne sont pas transmises au membre variable. Curieusement, quand j'utilise le code pour récupérer l'utilisateur sur la ligne ci-dessous:

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

Cela fonctionne très bien. Pas vraiment bon pour garder les choses SEC. Que se passe-t-il et puis-je utiliser la méthode Find de ma classe Members dans ma classe Addresses?

Lloyd

Était-ce utile?

La solution

C'est parce que vous retournez result, de Find, qui est un ExpandoObject.Pour accéder au Member dans Addresses, vous devez changer le code en:

var members = new Members();
var result = members.Find(email);
var member = result.Member;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top