在一些高階的開源專案中通常會使用到反射和打特性,如果對於c#初級的程式設計師第一眼看到肯定一臉懵逼,我以前也是這樣過來的所以今天公司沒啥事情可以幹,就寫一下筆記 ,unity 開源專案et(以前看et專案時只知道原理不知其中的**所以今天自已實現一下原理) 中就使用了這種方式實現。在此我解析一下反射與自定義特性的主要功能(反射網上搜尋一大堆這裡主要是介紹自定義特性的與反射結合使用的好處):
反射:反射就是通過引導程式集(什麼是程式集,程式集就是乙個檔案,乙個存放了il語句的dll,它可以是c#所有的語法或者說乙個專案中所有的cs檔案,打包成il語言,在此我們不學習il語法只知道它是什麼)獲取類(class)再獲取類中的屬性、方法、字段;
所以下面主要實現的功能是
例子 一: 通過反射呼叫方法
自定義 乙個 類(可以是抽象類也可以是普通類)
//命名空間
public virtual void updata()
}//繼承game
class compent : game
public override void updata()
}}
然後在主線程中解析程式集呼叫方法
}//找到了程式集所有繼承game的子類了並把它們都放在games列表裡邊
init();
//結束主線程
while (true)}}
//開始處理
static void init()
new thread(gamelogic).start();
}static void gamelogic()
thread.sleep(20);}}
}} 執行結果是
my start
updata
updata
簡單的反射呼叫方法已經完成了。
例子二:自定義特性的與反射結合使用
首先我自定義自已的乙個特性
}//自定義乙個player類
class player
[gamesystem]//也給updata打上特性
public void updata()
}} 然後在主線程中測試
}static void attributelogic(type type)}}
}}}
執行結果是
gamesystem start
my updata
這就是打特性的神其之處
只要你在任何方法中打上[gamesystem] 只要是無參的都可以任意執行(方法有返回值也可以),你也可以自已拓展方法中的引數。
C 通過反射呼叫方法
用反射呼叫方法 常用於軟體架構中 假如你定義好了基類和介面,其他人使用基類派生出新的方法,你在不知道有多少類會使用此基類派生,但是你需要呼叫所有的派生類的方法時,就可以這樣,直接遍歷相同命名空間中的由基類派生的所有類,然後例項化所有類,呼叫所有方法 using system using system...
反射機制 呼叫方法
通過反射機制,呼叫乙個物件的方法 獲取成員方法 public method getmethod string name,class.parametertypes 獲取單個公共成員方法 public method getdeclaredmethod string name,class.paramete...
C 的反射機制呼叫方法
net的反射 reflection 是非常完善和強大的,例如有名的.net反編譯工具red gate s net reflector就是使用了.net自身的反射機制,這裡有乙個比較簡單的例項 使用控制台程式 看看.net中如何使用反射。using system using system.reflec...