ダイナミクスを返すときにRuntimeBinderexceptionを取得するのはなぜですか?

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

  •  28-10-2019
  •  | 
  •  

質問

私は巨大なものを使用していて、メンバーテーブルを持っています。私のメンバーのクラスには、メールでメンバーを見つけるための検索方法があります。

   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 データが入っていることを示しています。

別々のクラスでは、アドレス。この方法を使用して、ユーザーが存在することを確認し、特定のメンバーのアドレスを挿入するときに使用するメンバーを取得するようにします。

 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); これは、アクセスしようとするときにruntimebinderexceptionを返します member.Member.Id. 。コードに足を踏み入れると、検索方法は正しいデータを「返す」ことですが、変数メンバーに渡されていません。奇妙なことに、コードを使用して以下の行でユーザーを取得した場合:

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

正常に動作します。しかし、物事を乾燥させておくのにはあまり良くありません。何が起こっているのか、アドレスクラス内のメンバークラスのFindメソッドを使用する方法はありますか?

ロイド

役に立ちましたか?

解決

それはあなたが戻ってきているからです result, 、 から Find, 、それはです ExpandoObject. 。にアクセスします MemberAddresses コードを次のように変更する必要があります。

var members = new Members();
var result = members.Find(email);
var member = result.Member;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top