c# 中反射里的invoke方法的參數


 
        
一個最簡單的C#反射實例,首先編寫類庫如下:
namespace ReflectionTest
{ 
public class WriteTest 
{ 
//帶參數的公共方法
public void WriteString(string s, int i) 
{ 
Console.WriteLine("WriteString:" + s + i.ToString()); 
} 
//帶一個參數的靜態方法
public static void StaticWriteString(string s)
{ 
Console.WriteLine("StaticWriteString:" + s); 
} 
//不帶參數的靜態方法
public static void NoneParaWriteString() 
{ 
Console.WriteLine("NoParaWriteString"); 
} 
} 
}

控制台程序項目如下:

class TestApp
{ 
public static void Main() 
{ 
Assembly ass; 
Type type; 
Object obj; 
//用來測試靜態方法
Object any = new Object(); 
//指定類庫文件必須使用絕對路徑,不能使用相對路徑
ass = Assembly.LoadFile(@"D:\Source Code\00.C#Sudy\01.Reflection\01\ReflectTest.dll"); 
//命名空間和類的名字必須一起指定 
type = ass.GetType("ReflectionTest.WriteTest"); 
/**//*example1---------*/ 
MethodInfo method = type.GetMethod("WriteString"); 
string test = "test"; 
int i = 1; 
Object[] parametors = new Object[]{test,i}; 
//在例子1種必須實例化反射要反射的類,因為要使用的方法並不是靜態方法。
//創建對象實例
obj = ass.CreateInstance("ReflectionTest.WriteTest"); //執行帶參數的公共方法
method.Invoke(obj, parametors); 
//method.Invoke(any, parametors);//異常:必須實例化反射要反射的類,因為要使用的方法並不是靜態方法。
/**//*example2----------*/ 
method = type.GetMethod("StaticWriteString"); 
method.Invoke(null, new string[] { "test"}); //第一個參數忽略//對於第一個參數是無視的,也就是我們寫什么都不會被調用,
//即使我們隨便new了一個any這樣的Object,當然這種寫法是不推薦的。
//但是對應在例子1種我們如果Invoke的時候用了類型不一致的實例來做為參數的話,將會導致一個運行時的錯誤。
method.Invoke(obj, new string[] { "test"});
method.Invoke(any, new string[] { "test"});
/**//*example3-----------*/ 
method = type.GetMethod("NoneParaWriteString"); //調用無參數靜態方法的例子,這時候兩個參數我們都不需要指定,用null就可以了。method.Invoke(null, null); 
} 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM