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
.
在程式中,如果我們要動態載入一個程式集有以下種方式可以使用,分別是Load
、LoadFrom
、LoadFile
、LoadWithPartialName
方法.
其中著重講解以下Assembly.LoadFile
與 Assembly.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();//轉換成窗體類,顯示
相關文章
- 通過反射獲取上傳檔案方法引數中的檔名反射
- Java——通過反射獲取函式引數名稱Java反射函式
- 通過反射獲取類的類名,方法和內部成員變數反射變數
- 反射如何獲取函式的引數名反射函式
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- 反射-通過反射獲取帶參構造方法並使用反射構造方法
- 反射-通過反射獲取成員變數並使用反射變數
- 如何通過反射獲得方法的真實引數名(以及擴充套件研究)反射套件
- c# 方法引數_值引數C#
- c# 方法引數_引用引數C#
- 反射-通過反射獲取私有構造方法並使用反射構造方法
- c#方法引數_輸出引數C#
- c# 方法引數_陣列引數C#陣列
- PHP --反射 --獲取類的方法PHP反射
- C# 帶引數帶互鎖多執行緒呼叫方法C#執行緒
- 反射-通過反射獲取無參構造方法並使用反射構造方法
- vue獲取位址列引數方法Vue
- C# 反射呼叫擴充類方法C#反射
- c# 反射呼叫方法C#反射
- 三種方法實現:獲取 url 中的引數
- Gson通過藉助TypeToken獲取泛型引數的型別的方法泛型型別
- Spring AOP獲取攔截方法的引數名稱跟引數值Spring
- 反射可以取到原始呼叫方法的變數名嗎?反射變數
- C#獲取URL引數值C#
- C#中命名引數和可選引數C#
- iOS 通過runtime獲取某個類中所有的變數和方法iOS變數
- 反射-通過反射獲取無參無返回值成員方法、帶參帶返回值成員方法並使用反射
- Spring LocalVariableTableParameterNameDiscoverer獲取方法的引數名Spring
- 使用jquery獲取url及url引數的方法jQuery
- 借用Java的Invoke反射,帶呼叫其他類的方法Java反射
- C#中的值引數,引用引數及輸出引數C#
- 【Java】利用反射執行Spring容器Bean指定的方法,支援多種引數自動呼叫Java反射SpringBean
- C# 解析獲取Url引數值C#
- 通過反射獲取私有內部類物件反射物件
- Java反射機制demo(五)—獲得並呼叫一個類中的方法Java反射
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- http獲取get引數過濾HTTP
- dwr框架帶引數,而且有返回值的方法呼叫框架