Perché sto ricevendo un runtimebinderexception quando sto tornando dinamico?
Domanda
Sto usando enorme e ho una tabella dei membri. Nella mia classe dei membri ho un metodo Find per trovare un membro via 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;
}
}
Questo restituisce tutto il previsto e in un test separato di unità che result.Member.Id
mostra che è popolato con i dati.
In una classe separata, indirizzi. Cerco di utilizzare questo metodo per verificare che l'utente esista e per recuperare il membro.id da utilizzare quando si inserisce un indirizzo per il membro particolare:
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;
}
}
Nella riga a schede che si legge var member = members.Find(email);
Questo sta restituendo un runtimebinderexception quando provo ad accedere member.Member.Id
. Passo al codice e il metodo Trova è "restituire" i dati corretti ma non vengono passati al membro variabile. Stranamente quando utilizzo il codice per recuperare l'utente sulla riga seguente:
result.Member = members.Single(where: "Email=@0", args: email);
Funziona bene. Tuttavia, non è davvero buono per mantenere le cose asciutte. Cosa sta succedendo e c'è un modo in cui posso usare il metodo di ricerca della mia classe dei membri all'interno della mia classe di indirizzi?
Lloyd
Soluzione
È perché stai tornando result
, da Find
, che è un ExpandoObject
. Per accedere al Member
in Addresses
Devi cambiare il codice in:
var members = new Members();
var result = members.Find(email);
var member = result.Member;