(C#)利用反射動態呼叫類成員
public object InvokeMember(
string name,
BindingFlags invokeAttr,
Binder binder,
object target,
object[] args
);
引數
name
String,它包含要呼叫的建構函式、方法、屬性或欄位成員的名稱。
- 或 -
空字串 (""),表示呼叫預設成員。
invokeAttr
一個位遮蔽,由一個或多個指定搜尋執行方式的 BindingFlags 組成。訪問可以是 BindingFlags 之一,如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。不需要指定查詢型別。如果省略查詢型別,則將應用 BindingFlags.Public | BindingFlags.Instance。
binder
一個 Binder 物件,該物件定義一組屬性並啟用繫結,而繫結可能涉及選擇過載方法、強制引數型別和透過反射呼叫成員。
- 或 -
若為空引用(Visual Basic 中為 Nothing),則使用 DefaultBinder。
target
要在其上呼叫指定成員的 Object。
args
包含傳遞給要呼叫的成員的引數的陣列。
返回值
表示被呼叫成員的返回值的 Object。
備註:
下列 BindingFlags 篩選標誌可用於定義包含在搜尋中的成員:
為了獲取返回值,必須指定 BindingFlags.Instance 或 BindingFlags.Static。
指定 BindingFlags.Public 可在搜尋中包含公共成員。
指定 BindingFlags.NonPublic 可在搜尋中包含非公共成員(即私有成員和受保護的成員)。
指定 BindingFlags.FlattenHierarchy 可包含層次結構上的靜態成員。
下列 BindingFlags 修飾符標誌可用於更改搜尋的執行方式:
BindingFlags.IgnoreCase,表示忽略 name 的大小寫。
BindingFlags.DeclaredOnly,僅搜尋 Type 上宣告的成員,而不搜尋被簡單繼承的成員。
可以使用下列 BindingFlags 呼叫標誌表示要對成員採取的操作:
CreateInstance,表示呼叫建構函式。忽略 name。對其他呼叫標誌無效。
InvokeMethod,表示呼叫方法,而不呼叫建構函式或型別初始值設定項。對 SetField 或 SetProperty 無效。
GetField,表示獲取欄位值。對 SetField 無效。
SetField,表示設定欄位值。對 GetField 無效。
GetProperty,表示獲取屬性。對 SetProperty 無效。
SetProperty 表示設定屬性。對 GetProperty 無效。
下面透過例題對該方法進行簡單應用(我一直以為,要讓例題起到更容易理解文字的意義和作用,撰寫的例題越簡單越直觀越好。)
using System;
using System.Reflection;
namespace ConsoleApplication9
{
class Love
{
public int field1;
private string _name;
public Love()
{
}
public string Name
{
get
{
return _name;
}
set
{
_name=value;
}
}
public int GetInt(int a)
{
return a;
}
public void Display(string str)
{
Console.WriteLine(str);
}
}
///
/// Class1 的摘要說明。
///
class Class1
{
///
/// 應用程式的主入口點。
///
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此處新增程式碼以啟動應用程式
//
Love love = new Love();
Type type = love.GetType();
Object bj = type.InvokeMember(null,
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);
//呼叫沒有返回值的方法
type.InvokeMember("Display",BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance , null , obj , new object[]{"aldfjdlf"});
//呼叫有返回值的方法
int i = (int)type.InvokeMember("GetInt",BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,null,obj,new object[]{1});
Console.WriteLine(i);
//設定屬性值
type.InvokeMember("Name",BindingFlags.SetProperty,null,obj,new string[]{"abc"});
//獲取屬性值
string str=(string)type.InvokeMember("Name",BindingFlags.GetProperty,null,obj,null);
Console.WriteLine(str);
//設定欄位值
type.InvokeMember("field1",BindingFlags.SetField,null,obj,new object[]{444});
//獲取欄位值
int f=(int)type.InvokeMember("field1",BindingFlags.GetField,null,obj,null);
Console.WriteLine(f);
Console.ReadLine();
}
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-734393/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- c# 用反射獲得靜態類成員C#反射
- C# 反射呼叫擴充類方法C#反射
- MFC之動態呼叫自己寫的類庫中的類的成員方法
- C#動態執行函式:利用反射實現C#函式反射
- worksheet類成員_c#C#
- C# 靜態成員與例項成員C#
- C#快速入門教程(3)——類的靜態成員和例項成員C#
- c# 反射呼叫方法C#反射
- PHP通過反射實現物件的成員方法呼叫PHP反射物件
- c#之arraylist類的成員C#
- C#動態呼叫webserviceC#Web
- C# 如何利用反射來載入程式集,並呼叫程式集中有關類的方法C#反射
- C++類靜態成員C++
- Java的靜態成員類Java
- c#通過反射動態執行類的例項及靜態方法C#反射
- c# 基類派生類成員方法訪問C#
- C++類中的常成員和靜態成員C++
- 反射+Class類方法_利用反射分析類的能力反射
- C#動態呼叫WCF介面C#
- c#物件導向- 靜態成員和非靜態成員的區別C#物件
- c++類的靜態成員C++
- C++:類的靜態成員C++
- C++ 類的靜態成員C++
- 使用反射-動態建立物件及呼叫物件方法反射物件
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- 類內的靜態成員函式函式
- C#利用反射建立例項C#反射
- c#類的成員初始化順序C#
- Python關於反射和類的特殊成員方法詳解Python反射
- 通過反射獲取類的類名,方法和內部成員變數反射變數
- 組合(巢狀)的 補充,主動呼叫其他成員 以及特殊成員巢狀
- oop類的繼承與類靜態成員學習OOP繼承
- C#根據反射動態建立ShowDoc介面文字資訊C#反射
- 反射-通過反射獲取成員變數並使用反射變數
- C#呼叫C++動態連結庫C#C++
- C++呼叫C#的動態庫dllC++C#
- 淺談C++指標直接呼叫類成員函式C++指標函式
- Python的靜態方法和類成員方法Python