2017-05-17 10 views
0

それぞれのifパターンでif-elseを単一条件で変換する方法を知っています。 しかし、私のコードでは、if内に& &演算子で区切られた複数の条件があるので、私はちょっと混乱しています。 このようなケースをどのようにリファクタリングするかif-elseを複数の条件でデザインパターンで変換する方法C#

コードは以下のとおりである:

public ActionResult PaymentDetails(PaymentlistingDTOVM model, string SearchButton) 
    { 
     PaymentlistingDTOVM dto = new PaymentlistingDTOVM(); 

     if (model.PaymentSearch == null) 
     { 
      ModelState.AddModelError("Message", "Please select type to search (Member No/Member Name)."); 
     } 
     else if (model.PaymentSearch == "1" && model.Memberno == null) 
     { 
      ModelState.AddModelError("Message", "Please Enter Member No."); 
     } 
     else if (model.PaymentSearch == "2" && model.MemberName == null) 
     { 
      ModelState.AddModelError("Message", "Please Enter Member Name."); 
     } 
     else 
     { 
      if (!string.IsNullOrEmpty(model.SearchButton) || model.Page.HasValue) 
      { 
       if (model.Memberno != null) 
       { 
        var Listpay = objIPaymentlisting.AllPaymentDetails(Convert.ToString(model.Memberno)); 

        var results = Listpay.Where(p => (p.MemberID == model.Memberno)); 

        var pageIndex = model.Page ?? 1; 

        model.SearchResults = results.ToPagedList(pageIndex, RecordsPerPage); 
       } 
       else if (model.MemberName != null) 
       { 
        string[] Memno = model.MemberName.Split('|'); 

        var Listpay = objIPaymentlisting.AllPaymentDetails(Convert.ToString(Memno[3])); 

        var results = Listpay.Where(p => (p.MemberID == Convert.ToInt32(Memno[3]))); 

        var pageIndex = model.Page ?? 1; 

        model.SearchResults = results.ToPagedList(pageIndex, RecordsPerPage); 
       } 
      } 
     } 

     return View(model); 
    } 

答えて

0

あなたは、次の

public interface ICondition<T> 
{ 
    bool IsSatisfied(T obj); 
} 

としてPaymentlistingDTOVMインスタンスを受け取り、その後、あなたはそれぞれのケースの実装を作成することができますIConditionインターフェースを作成することができます。もちろん、実装が非常に小さくしようとしていることから、あなたはこのような一般的な実装を作成することができます。たとえば

public class FuncBasedCondition<T> : ICondition<T> 
{ 
    private readonly Func<T, bool> predicate; 

    public FuncBasedCondition(Func<T, bool> predicate) 
    { 
     this.predicate = predicate; 
    } 

    //For C# 6, expression-bodied members can be used like this 
    //public bool IsSatisfied(T obj) => predicate(obj); 
    public bool IsSatisfied(T obj) 
    { 
     return predicate(obj); 
    } 
} 

を、最初の条件のインスタンスを作成するには、よう、条件クラスのインスタンスを作成します次

new FuncBasedCondition<PaymentlistingDTOVM>(model => model.PaymentSearch == null); 

次に、あなたが処理するために必要なさまざまな条件に異なる参照を受け入れるようにコントローラを(またはあなたが示されているコードが存在する場所)を調整。

+0

コンパイルエラー(行53、列30):;期待値 コンパイルエラー(行53、列32):戻り値の型を持つメソッドが必要 コンパイルエラー(行53、列45):識別子が必要です –

+0

次の文でエラーが発生しています:public bool IsSatisfied(T obj)=>述語obj);エラー:コンパイルエラー(53行目、30行目):;期待値 コンパイルエラー(行53、列32):メソッドに戻り値の型が必要です コンパイルエラー(行53、列45):識別子が必要です –

+0

これはC#6(Expression-bodied members)の機能です。より小さなバージョンを使用している場合は、通常のメソッド本体に変更することができます。 –

関連する問題