1. 程式人生 > >C#通過反射獲取類中的方法和引數個數,反射呼叫方法帶引數

C#通過反射獲取類中的方法和引數個數,反射呼叫方法帶引數

using System;
using System.Reflection;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            //反射獲取 名稱空間+類名
            string className = "ConsoleApp2.ClassSample";
            string methodName = "test1";
            //傳遞引數
            Object[] paras = new
Object[] { "我的", "電腦" }; var t = Type.GetType(className); object obj = Activator.CreateInstance(t); try { #region 方法一 //直接呼叫 MethodInfo method = t.GetMethod("test2"); method.Invoke(obj, paras); #endregion
#region 方法二 MethodInfo[] info = t.GetMethods(); for (int i = 0; i < info.Length; i++) { var md = info[i]; //方法名 string mothodName = md.Name; //引數集合 ParameterInfo[] paramInfos = md.GetParameters(); //方法名相同且引數個數一樣
if (mothodName == methodName && paramInfos.Length == paras.Length) { md.Invoke(obj, paras); } } #endregion } catch (Exception ex) { throw ex; } Console.ReadKey(); } } class ClassSample { public void test1(string para1) { Console.WriteLine("方式1 {0}________test111", para1); } public void test1(string para1, string para2) { Console.WriteLine("方式2 {0}________test111________{1}", para1, para2); } public void test2(string para1, string para2) { Console.WriteLine("方式3 {0}________test222________{1}", para1, para2); } } }

在C#中,我們要使用反射,首先要搞清楚以下名稱空間中幾個類的關係:

System.Reflection名稱空間

(1) AppDomain:應用程式域,可以將其理解為一組程式集的邏輯容器

(2) Assembly:程式集類

(3) Module:模組類

(4) Type:使用反射得到型別資訊的最核心的類

他們之間是一種從屬關係,也就是說,一個AppDomain可以包含N個Assembly,一個Assembly可以包含N個Module,而一個Module可以包含N個Type.

在程式中,如果我們要動態載入一個程式集有以下種方式可以使用,分別是LoadLoadFromLoadFileLoadWithPartialName方法.

其中著重講解以下Assembly.LoadFileAssembly.LoadFrom的區別

1、Assembly.LoadFile只載入相應的dll檔案,比如Assembly.LoadFile("abc.dll"),則載入abc.dll,假如abc.dll中引用了def.dll的話,def.dll並不會被載入。

Assembly.LoadFrom則不一樣,它會載入dll檔案及其引用的其他dll,比如上面的例子,def.dll也會被載入。

2、用Assembly.LoadFrom載入一個Assembly時,會先檢查前面是否已經載入過相同名字的Assembly,比如abc.dll有兩個版本(版本1在目錄1下,版本2放在目錄2下),程式一開始時載入了版本1,當使用Assembly.LoadFrom("2\\abc.dll")載入版本2時,不能載入,而是返回版本1。Assembly.LoadFile的話則不會做這樣的檢查,比如上面的例子換成Assembly.LoadFile的話,則能正確載入版本2。

LoadFile:載入指定路徑上的程式集檔案的內容。LoadFrom: 根據程式集的檔名載入程式集檔案的內容。

最後是呼叫方法

Assembly outerAsm = Assembly.LoadFrom(@"urPath\MyDLL.dll");

呼叫DLL類中的方法

Type type = outerAsm .GetType("MyDLL.MyClass");//呼叫型別
MethodInfo method = type.GetMethod("MyVoid");//呼叫方法
//如果需要傳引數

object[] paramertors = new object[] { "3087", "2005" };//引數集合
object test = method.Invoke(null, paramertors);//Invoke呼叫方法

呼叫DLL中窗體

Type outerForm = outerAsm.GetType("MyForm", false);//找到指定視窗
(Activator.CreateInstance(outerForm) as Form).Show();//轉換成窗體類,顯示

相關推薦

C#通過反射獲取方法參數個數反射調用方法參數

new [] 反射 電腦 ram col sta body create using System; using System.Reflection; namespace ConsoleApp2 { class Program { sta

C#通過反射獲取方法引數個數反射呼叫方法引數

using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(string[] args)

[反射初探]根據反射獲取引數型別及引數引數值

public String getMyDeclaredMethods(T t) { Class<?> c = t.getClass(); Method m[] = c.getDeclaredMethods(); String text = "";

反射獲取的指定字段

int tde rgs 修改 pub print tac forname cep ** Class.getField(String)方法可以獲取類中的指定字段(可見的), 如果是私有的可以用getDeclaedField("name")方法獲取,通過s

java 反射獲取所有的屬性(含父

直接上程式碼 public static List<Field> getFieldList(Class<?> clazz){ if(null == clazz){

【Java必修課】通過Value獲取Map的鍵值Key的四種方法

1 簡介 我們都知道Map是存放鍵值對<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速獲取Value值。然而,有的時候我們需要反過來獲取,知道Value值,求Key值。 本文將用例項介紹四種方法,通過傳入Value值,獲取得到Key值。 2 四種方法 2.1 迴

java統計一個建立物件的個數並使物件id遞增---static關鍵字的使用

一、思路 主要處理的問題:統計一個類中建立的物件的個數 1、在類中設定一個static的int變數,每次建立一個物件時,count加1。 staic int count=0; Person(){++count;} 2、 同時要讓物件的id遞增,只需把count加1的結果賦給

JavaProcessRuntime()使用以及呼叫cmd命令阻塞在process.waitfor( )的問題解決

轉自:http://249wangmang.blog.163.com/blog/static/52630765201261334351635/ 最近在java中呼叫perl程式,由於perl中使用斯坦福分詞器,有很多控制檯輸出,導致一直阻塞在process.waitfor

C#反射 獲取程式集資訊通過名建立例項

C#反射獲取程式集資訊和通過類名建立類例項 。 System.Reflection 名稱空間:包含通過檢查託管程式碼中程式集、模組、成員、引數和其他實體的元資料來檢索其相關資訊的型別。 Assembly 類:表示一個程式集,它是一個可重用、無版本衝突並且可自我描述的公共語言

php反射獲取方法的註釋

通過php中的反射機制,獲取該類的文件註釋,再通過獲取其所有的方法,獲取方法的註釋 所用到的主要類及其方法 ReflectionClass ReflectionClass::getDocComment ReflectionClass::getMethods $meth

【Java學習筆記】66:認識Java的Reflection(反射)機制,獲取的屬性方法

反射部分一直欠著,現在學框架和Servlet必須要學一下了。最近學習Struts2框架和Servlet時候,很多地方直接給出類名就可以去使用了,如在web.xml中配置Filter時: <filter> <filter-name&

Java 自定義註解&通過反射獲取方法、屬性上的註解

反射 JAVA中的反射是執行中的程式檢查自己和軟體執行環境的能力,它可以根據它發現的進行改變。通俗的講就是反射可以在執行時根據指定的類名獲得類的資訊。   註解的定義 註解通過 @interface 關鍵字進行定義。 /** * 自定義註解 *

Java筆記:[反射篇] 利用反射獲取的私有內部類物件呼叫該物件的方法

public void smoothScrollBy(int dx, int dy, int duration) { try { Class<?> c = null; try { c = Class

Java反射之——Java獲取成員變數建構函式的資訊

我們無論是獲取成員變數資訊,亦或者是獲取建構函式的資訊,都必須獲取類的類型別,然後通過類的類型別進行對成員變數和建構函式的操作。 注:成員變數和建構函式也都是物件,前者是Feild的物件,在java.lang.reflec.Feild中封裝了對成員變數的資訊。後者是Constructor的物件,

c#通過反射獲取上的自定義特性

下面這個是筆者在以前的一個專案中用到的。當時是為了在匯出excel報表的時侯,通過自定義特性,包含一些可配置的特性在裡面。具體的操作excel不是本文重點,本文不會多做說明。下面只寫個示例,簡單說明一下如何通過反射獲取自定義特性。示例只在類和屬性上使用了自定義特性。讀者可以按照實際的專案需求,合理使用自定義

C++自動型轉化--特殊構造函數方法重載的運算符方法

allow pub tdi exp 阻止 stdio.h public stream esp 一、重載運算符法 #include <stdio.h> #include <iostream> class Three { int i; pub

C# 基礎知識-07----.NETDirectory Path Environment

cto directory .com -- mage rec alt 基礎 path C# 基礎知識-07----.NET中Directory 和Path 類 和 Environment類

C#獲取上個月第一天最後一天日期的方法

分享 ble bsp 圖片 span margin date 文章 相關 本文實例講述了C#獲取上個月第一天和最後一天日期的方法。分享給大家供大家參考。 具體實現代碼如下: 代碼如下: int year = DateTime.Now.Year;//當前年 int m

python 獲取除內置方法外的所有方法名

self callable pro clas top end method __name__ __main__ #!/usr/bin/env python# !-*- coding:utf-8 -*-class Menu: def __init__(self):

反射獲取的 屬性名(name) 值(value)

1.新建物件user: package com.entity; public class User {     private String id;     private String name;