獲取Key-Value的Helper類代碼:
public class SmsGeneratorHelper
{
/// <summary>
/// 從短信實體獲取要替換的鍵值對,用以替換短信模板中的變量
/// </summary>
/// <param name="objMessage">短信實體</param>
/// <returns></returns>
public static Dictionary<string, string> GetMessageKeyValue(object objMessage)
{
Type msgType = objMessage.GetType();
Dictionary<string, string> dicMsg = new Dictionary<string, string>();
Type typeDescription = typeof(DescriptionAttribute);
PropertyInfo[] proList = msgType.GetPropertIEs();
string strKey = string.Empty;
string strValue = string.Empty;
foreach (PropertyInfo pro in proList)
{
//利用反射取得屬性的get方法。
MethodInfo m = pro.GetGetMethod();
//利用反射調用屬性的get方法,取得屬性的值
object rs = m.Invoke(objMessage, null);
object[] arr = pro.GetCustomAttributes(typeDescription, true);
if (!(arr.Length > 0))
{
continue;
}
DescriptionAttribute aa = (DescriptionAttribute)arr[0];
strKey = aa.Description;
dicMsg.Add(strKey, rs.ToString());
}
return dicMsg;
}
}
測試代碼:
Message msg = new Message() { UserName = "張三", Content = "祝你生日快樂",Date=DateTime.Now.ToString("yyyy-MM-dd")};
Dictionary<string,string> nvc = SmsGeneratorHelper.GetMessageKeyValue(msg);
string template = "[用戶名],今天是[日期],[內容]";
Console.WriteLine("模板是:{0}", template);
foreach(KeyValuePair<string,string> kvp in nvc)
{
template = template.Replace(kvp.Key, kvp.Value);
}
Console.WriteLine("替換後的內容:{0}", template);
看到了吧,結果出來了,而那段惡心的代碼“template.Replace("[用戶名]", userName).Replace("[日期]", date).Replace("[內容]", content)”消失了。
如果有新模板了,直接寫一個模板實體類,將裡面的字段貼上[Description("xxx")]標簽就可以很方便生成短信了。
至於如何給模板實體類賦值(具體業務的問題),那就不是本文討論的范圍了。