2016-04-06 3 views
0

&と呼ばれるメソッドを指定できる汎用関数を作成しようとしていますが、失敗する前に結果を取得する必要があります。以下のようなc#またはvbコードブロックを再試行する汎用関数n回数

何か:

//3 stands for maximum number of times GetCustomerbyId should be called if it fails on first attempt. 
var result = RetryCall(GetCustomerbyId(id),3); 

第二に、戻り値の型は、それが呼び出している関数に基づいて自動的に調整されなければなりません。

たとえば、次の両方の関数から結果を得ることができます.1つは文字列&他のカスタマーエンティティを返します。

public static string GetCustomerFullNamebyId(int id){ 
    return dataContext.Customers.Where(c => c.Id.Equals(id)).SingleOrDefault().FullName; 
} 

public static Customer GetCustomerbyId(int id){ 
    return dataContext.Customers.Find(id); 
} 

これは可能ですか?

+0

「GetCustomerbyId(id)」を呼び出すと、どのような障害が発生しますか?例外? 'ヌル'文字列ですか? 'ヌル'オブジェクト? – Enigmativity

答えて

2

次の操作を行うことができます

public T Retry<T>(Func<T> getter, int count) 
{ 
    for (int i = 0; i < (count - 1); i++) 
    { 
    try 
    { 
     return getter(); 
    } 
    catch (Exception e) 
    { 
     // Log e 
    } 
    } 

    return getter(); 
} 

const int retryCount = 3; 

Customer customer = Retry(() => GetCustomerByID(id), retryCount); 
string customerFullName = Retry(() => GetCustomerFullNamebyId(id), retryCount); 

質問は、最初のn個の試行中に例外の場合に何をするかですか?私はあなたが例外を記録することができますが、呼び出し側がそれを見ないことに気づくでしょう。

+0

おかげでvc、それは魅力的だった。正確に必要なもの。 – Robin

2

ループ機能を実行し、試行回数が試行回数に一致するかどうかを確認する変数を設定することもできます。

private static void DoSomeTask(int RetryCount) 
    { 
     int Count = 0; 
     while (Count != RetryCount) 
     { 
      DoCustomerLookUp(); // or whatever you want to do 
      Count++; 
     } 
    } 
+0

あなたの答えには感謝していますが、最初に返信したVCの回答を答えとしてマークしています。 – Robin

+0

努力のためのアップヴォートかもしれませんが、歓迎です:) –

+0

確かに、私の謝罪は票を払うのを忘れました。もう一度ありがとうDr – Robin