C#单例反射
反射單例
背景
C#代碼中涉及到存儲窗體位置,并在下一次打開軟件的時候,自動展示上一次保存的窗體及位置
實現(xiàn)邏輯
窗體在軟件中使用單例模式,為了方便編碼,因此寫了單例基類
單例基類
public abstract class SingletonWindowBase<T> where T : Window, new(){private static T _instance;private readonly static object _obj = new object();/// <summary>/// 實例個數(shù)/// </summary>private static int _instanceNum = 0;public static T Instance{get{return GetInstance();}}public static T GetInstance() {if (_instance == null){//線程鎖,線程安全lock (_obj){if (_instance == null){_instance = new T();}}}return _instance;}protected SingletonWindowBase(){_instanceNum++;if (_instanceNum > 1){throw new Exception(string.Format("SingletonWindowBase類型{0}實例擁有多個", _instance));}}public static void Dispose(){_instance = null;}}反射
反射時,能夠根據(jù)窗體/類名獲取到其擁有的方法,但其方法中并沒有包含單例基類的方法
Type type = Assembly.GetExecutingAssembly().GetType("類的全域名稱"); MethodInfo mi = type.GetMethod("GetInstance"); //==>返回null因此,需要修改獲取方法,通過其基類來獲取,此時即可以取到要使用到的GetInstance方法
Type type = Assembly.GetExecutingAssembly().GetType("類的全域名稱"); MethodInfo mi = type.BaseType.GetMethod("GetInstance"); var obj = mi.Invoke(null, null);對比
使用要反射獲取的單例類的實例與通過反射方法獲取的實例進行比對
return obj.Equals(類名.Instance); //==>返回true總結(jié)
- 上一篇: 大话西游的话剧
- 下一篇: 亲试:darknet_yolov3批量测