日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#单例反射

發(fā)布時(shí)間:2024/3/13 C# 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#单例反射 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

反射單例

背景

C#代碼中涉及到存儲窗體位置,并在下一次打開軟件的時(shí)候,自動展示上一次保存的窗體及位置

實(shí)現(xiàn)邏輯

窗體在軟件中使用單例模式,為了方便編碼,因此寫了單例基類

單例基類

public abstract class SingletonWindowBase<T> where T : Window, new(){private static T _instance;private readonly static object _obj = new object();/// <summary>/// 實(shí)例個(gè)數(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}實(shí)例擁有多個(gè)", _instance));}}public static void Dispose(){_instance = null;}}

反射

反射時(shí),能夠根據(jù)窗體/類名獲取到其擁有的方法,但其方法中并沒有包含單例基類的方法

Type type = Assembly.GetExecutingAssembly().GetType("類的全域名稱"); MethodInfo mi = type.GetMethod("GetInstance"); //==>返回null

因此,需要修改獲取方法,通過其基類來獲取,此時(shí)即可以取到要使用到的GetInstance方法

Type type = Assembly.GetExecutingAssembly().GetType("類的全域名稱"); MethodInfo mi = type.BaseType.GetMethod("GetInstance"); var obj = mi.Invoke(null, null);

對比

使用要反射獲取的單例類的實(shí)例與通過反射方法獲取的實(shí)例進(jìn)行比對

return obj.Equals(類名.Instance); //==>返回true

總結(jié)

以上是生活随笔為你收集整理的C#单例反射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。