做過架構的朋友或許都有過不知道開發人員要幹什麼確需要知道開發人員能幹什麼的困惑,估計大家的解決思路應該也會往一處想-反射
介紹下自己的實現思路和代碼:
1、定義介面
如:
/// <summary>
/// 定義了列配置預設值的C#計算規則介面
/// by 賈世義 2009-1-15
/// </summary>
public interface IDefaultCalc
{
/// <summary>
/// 配置的參數值字串
/// </summary>
string Parameter { get; set; }
/// <summary>
/// 目前使用者的帳號
/// </summary>
string UserAccount { get; set; }
/// <summary>
/// 計算方法 返回的值作為預設值
/// </summary>
/// <returns></returns>
object GetValue();
}
2、反射介面
/// <summary>
/// 反射判斷類是否實現IDefaultCalc
/// </summary>
/// <param name="iDefaultCalc"></param>
/// <returns>錯誤 null時正確</returns>
public static string IsDefaultCalc(string iDefaultCalc)
{
if (String.IsNullOrEmpty(iDefaultCalc))
{
return "類名稱不可為空,需要為實現了IDefaultCalc介面的類名";
}
try
{
int p = iDefaultCalc.LastIndexOf(".");
if (p > 0)
{
Assembly calcAssembly = Assembly.Load(iDefaultCalc.Substring(0, p));
object calcObj = calcAssembly.CreateInstance(iDefaultCalc, true);
if (calcObj == null)
{
return "類反射錯誤:" + iDefaultCalc + "不存在";
}
else if (calcObj is IDefaultCalc)
{
return null;
}
else
{
return iDefaultCalc + "類未實現IDefaultCalc介面";
}
}
else
{
return iDefaultCalc + "類必須有命名空間";
}
}
catch (Exception ex)
{
return iDefaultCalc + "類反射錯誤:" + ex.Message;
}
}
3、提供配置實作類別的入口
在xml中定義預設值字串,如:MyQuery.BAL.QueryDefault
4、使用者需要繼承介面實作類別
如:
using System;
using System.Collections.Generic;
using System.Text;
using MyQuery.MyControl;
using MyQuery.DAL;
using MyQuery.Utils;
using System.Web;
namespace PASA.BAL
{
/// <summary>
/// 針對查詢範本Foot的列計算介面的實現
/// by 賈世義 2009-1-28
/// </summary>
public class QueryDefault : IDefaultCalc
{
#region IDefaultCalc Members
private string _parameter = null;
/// <summary>
/// 配置的參數值字串
/// </summary>
public string Parameter
{
get
{
return _parameter;
}
set
{
_parameter = value;
}
}
private string _userAccount = null;
/// <summary>
/// 目前使用者的帳號
/// </summary>
public string UserAccount
{
get
{
return _userAccount;
}
set
{
_userAccount = value;
}
}
#endregion
/// <summary>
/// 返回有Parameter計算的來的值
/// 注意當else if多於10個時建議再仿照此類另建一個實作類別,配置中配成新實現的類名即可
/// </summary>
/// <returns></returns>
public object GetValue()
{
if (String.IsNullOrEmpty(Parameter))
{
return null;
}
#region 自訂處理
else if ("getdate".Equals(Parameter, StringComparison.CurrentCultureIgnoreCase))
{
return DateTime.Today.ToString();
}
#endregion
else
{
return null;
}
}
}
}
歡迎訪問:http://121.18.78.216 適易查詢分析、工作流程、內容管理及專案管理示範平台