2016-07-07 4 views
-2

私はクラスCustomerを持っており、Customerクラスを変更せずに異なるフォーマットを作成する必要があります。私はこのためにCustomerFormatProviderを作成しました。 Customer.Format()が呼び出されると、CustomFormatProvider.Formatは無視されます。なぜ ??? 助けてください!!!!なぜフォーマットが機能しないのですか?

public class Customer 
{ 
    private string name; 
    private decimal revenue; 
    private string contactPhone; 

    public string Name { get; set; } 
    public decimal Revenue { get; set; } 
    public string ContactPhone { get; set; } 

    public string Format(string format) 
    { 
     CustomerFormatProvider formatProvider = new CustomerFormatProvider(); 
     return string.Format(formatProvider, format, this); 
    } 
} 
public class CustomerFormatProvider : ICustomFormatter, IFormatProvider 
{ 
    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 
     return null; 
    } 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     Customer customer = (Customer) arg; 
     StringBuilder str = new StringBuilder(); 

     str.Append("Customer record:"); 

     if (format.Contains("N")) 
     { 
      str.Append(" " + customer.Name); 
     } 

     if (format.Contains("R")) 
     { 
      str.Append($"{customer.Revenue:C}"); 
     } 

     if (format.Contains("C")) 
     { 
      str.Append(" " + customer.ContactPhone); 
     } 

     return str.ToString(); 
    } 
} 
+0

質問が不明なので投票を停止してください。あなたは、 'CustomerFormatProvider'クラスのFormatメソッドへの呼び出しを持っていないようです。それでは、プログラムの実行中にその関数が無視されているとはどういう意味でしょうか? – ViVi

+0

@ViVi、それはフォーマットプロバイダです。 'Format'メソッドの直接呼び出しはありません。 @Pavelは、 'Customer.Format()'を呼び出している間、エラーに直面していると述べています。彼は呼び出しコードについて言及する必要がありますが、あなたのdownvoteの背後にある仮定はおそらく間違っていました。 – Ash

答えて

0

私はFormatメソッドの呼び出し方法に問題があると思います。次のいずれかが動作します:

var cust = new Customer() {Name="name", Revenue=12M, ContactPhone = "042681494"}; 
var existing = cust.Format("{0:N} - {0:R} - {0:C}"); 
var newImpl = string.Format(new CustomerFormatProvider(), "{0:N} - {0:R} - {0:C}", cust); 

あるいは

var existing1 = cust.Format("{0:NRC}"); 
var newImpl1 = string.Format(new CustomerFormatProvider(), "{0:NRC}", cust); 

あなたはおそらく同様にFormatメソッド内での書式設定のデフォルトを処理する必要があります。

関連する問題