2016-06-30 4 views
0

私はこのような特定のオブジェクト、 から日の名を抽出する方法があります:ジェネリックメソッドを作る

private string ExtractWeekDayNames(FiscalReceipt fiscalReceipt) 
    { 
     string retVal = ""; 

     Dictionary<string, bool> WeekDays = 
      new Dictionary<string, bool>() { 
              { "Sun", fiscalReceipt.Sunday }, 
              { "Mon", fiscalReceipt.Monday }, 
              { "Tue", fiscalReceipt.Tuesday }, 
              { "Wed", fiscalReceipt.Wednesday }, 
              { "Thu", fiscalReceipt.Thursday }, 
              { "Fri", fiscalReceipt.Friday }, 
              { "Sat", fiscalReceipt.Saturday } 
              }; 


     //Find week days 
     foreach (var item in WeekDays) 
     { 
      if (item.Value == true) 
       retVal += item.Key + ","; 
     } 

     if (!string.IsNullOrEmpty(retVal)) 
      retVal = retVal.Substring(0, retVal.Length - 1); 

     return retVal; 

    } 

は私も同じ操作 を行い、同様の方法を持っていますが、パラメータの異なるタイプを有します、のように:

private string ExtractWeekDayNames(NonFiscalReceipt nonFiscalReceipt) 
{ 
    ... 
} 

またNonFiscalReceiptは性質日曜日、月曜日、など

私はどのように置き換えることができますがありますこれらの2つの方法だけで1つ?

+2

financialrecipentとnonfiscalreceiptは同じタイプの基本クラスから派生していますか?もしそうなら、引数を基本クラスとして取ることができます。 – JonH

+2

これを短縮すると、 'return string.Join("、 "WeekDays.Where(kvp => kvp.Value).Select(kvp => kvp.Key)); ' – juharr

+1

を返すことができます。曜日のプロパティを持つインターフェイスを作成し、両方のクラスで実装できるようにします。次に、現在のクラスの代わりにメソッドにインターフェイスを渡すことができます。 – Philippe

答えて

-1

共通プロパティを含むNonFiscalReceiptFiscalReceiptの基本インタフェースを作成します。

public interface IReceipt 
{ 
    bool Sunday{get;} 
    ...... 
} 

はこれにメソッドシグネチャを交換:private string ExtractWeekDayNames(IReceipt fiscalReceipt)

は、それが可能な場合DayOfWeek列挙を使用してみてください。領収書の

+0

その署名は正しいのですか?あなたはインターフェースをとらないでしょうか? – JonH

+0

@JonH correct、私はそれを答えからコピーして、それを更新するのを忘れました。お返事ありがとう –

+0

Radin – Ciupaz

2
public class FiscalReceipt : Receipt{ 
FiscalReceipt specific fields 
} 

public class NonFiscalReceipt : Receipt{ 
NonFiscalReceipt specific fields.. 
} 

public class Receipt{ 
fields common to both classes 
} 

private string ExtractWeekDayNames(Receipt receipt){ 

} 

どちらのタイプには、それはあなたがいずれかに渡すことができますし、まだそのようにあなたがあなたのクラスが実装するための共通のインターフェースを作成するために必要なすべてのフィールド:)

1

を持つことになりました、領収書を継承しますメソッドはこのインタフェースを実装するものをすべて受け入れることができます。

interface IReceipt 
{ 
    bool Sunday {get; } 
    bool Monday {get; } 
    ... 
    bool Saturday {get; } 
} 

次に、あなたの方法は次のようになります。

private string ExtractWeekDayNames<T>(T receipt) where T : IReceipt 
{ 
    string retVal = ""; 

    Dictionary<string, bool> WeekDays = 
     new Dictionary<string, bool>() { 
             { "Sun", receipt.Sunday }, 
             { "Mon", fiscalReceipt.Monday }, 
             { "Tue", receipt.Tuesday }, 
             { "Wed", receipt.Wednesday }, 
             { "Thu", receipt.Thursday }, 
             { "Fri", receipt.Friday }, 
             { "Sat", receipt.Saturday } 
             }; 


    //Find week days 
    foreach (var item in WeekDays) 
    { 
     if (item.Value == true) 
      retVal += item.Key + ","; 
    } 

    if (!string.IsNullOrEmpty(retVal)) 
     retVal = retVal.Substring(0, retVal.Length - 1); 

    return retVal; 

} 

をしかし、juharrとレミー・グランディンは当然のコメントで書いたように - この場合は、ジェネリック医薬品のための必要はありません - あなたができるだけでメソッドにインターフェイスを渡します。

private string ExtractWeekDayNames(IReceipt receipt) 
{ 
    string retVal = ""; 

    Dictionary<string, bool> WeekDays = 
     new Dictionary<string, bool>() { 
             { "Sun", receipt.Sunday }, 
             { "Mon", receipt.Monday }, 
             { "Tue", receipt.Tuesday }, 
             { "Wed", receipt.Wednesday }, 
             { "Thu", receipt.Thursday }, 
             { "Fri", receipt.Friday }, 
             { "Sat", receipt.Saturday } 
             }; 


    //Find week days 
    foreach (var item in WeekDays) 
    { 
     if (item.Value == true) 
      retVal += item.Key + ","; 
    } 

    if (!string.IsNullOrEmpty(retVal)) 
     retVal = retVal.Substring(0, retVal.Length - 1); 

    return retVal; 

} 
+1

ありがとうございます。しかし、この時点では、ジェネリックスを使用する代わりに、インターフェイスに渡すことができます。 – juharr

+0

なぜインターフェイスの型付きパラメータで十分であったT genericを使用するのですか? –

+0

良い点は、それは単に質問のタイトルのためです。私の答えを編集します。 –

関連する問題