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();//轉換成窗體類,顯示
相關推薦
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的結果賦給
Java中Process和Runtime()使用,以及呼叫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----.NET中Directory 和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;