using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
var p = new Product("A123456", "hogehoge");
Console.WriteLine(p.ToString("%y年%m月%d日 - %c - %n"));
Console.ReadKey();
}
}
class SymbolTranslator
{
private Dictionary<string, Func<string>> mRuleTable
= new Dictionary<string, Func<string>>();
public void AddRule(string symbol, Func<string> func)
{
mRuleTable.Add(symbol, func);
}
public void AddRule(string symbol, string translation)
{
mRuleTable.Add(symbol, () => translation);
}
public string Translate(string symbol)
{
return mRuleTable.ContainsKey(symbol) ? mRuleTable[symbol]() : symbol;
}
}
class Product : IFormattable
{
SymbolTranslator mTranslator = new SymbolTranslator();
public Product(string code, string name)
{
Code = code; Name = name;
mTranslator.AddRule("c", code);
mTranslator.AddRule("n", name);
mTranslator.AddRule("y", () => DateTime.Now.ToString("yyyy"));
mTranslator.AddRule("m", () => DateTime.Now.ToString("MM"));
mTranslator.AddRule("d", () => DateTime.Now.ToString("dd"));
}
public string Code { get; private set; }
public string Name { get; private set; }
// Object.ToStringのオーバーライド
public override string ToString()
{
// 書式と書式プロバイダを指定せずにToStringを呼ぶ
return ToString("", null);
}
public string ToString(string format)
{
// 書式プロバイダを指定せずにToStringを呼ぶ
return ToString(format, null);
}
public string ToString(string format, IFormatProvider formatProvider)
{
var regex = new Regex(@"(?<pre>[^%]*)%(?<symbol>[^%])");
return regex.Replace(format, Evaluator);
}
private string Evaluator(Match m)
{
return m.Groups["pre"].Value + mTranslator.Translate(m.Groups["symbol"].Value);
}
}