2012-04-27 150 views
1

我想知道如何在c#中使用反射調用方法。如何使用反射調用方法

這是我從書中挑選的代碼

using System; 
using System.Reflection; 
class MyClass { 
int x; 
int y; 
public MyClass(int i, int j) { 
x = i; 
y = j; 
} 
public int Sum() { 
return x+y; 
} 
public bool IsBetween(int i) { 
if((x < i) && (i < y)) return true; 
else return false; 
} 
public void Set(int a, int b) { 
Console.Write("Inside Set(int, int). "); 
x = a; 
     y = b; 
Show(); 
} 
// Overload set. 
public void Set(double a, double b) { 
Console.Write("Inside Set(double, double). "); 
x = (int) a; 
y = (int) b; 
Show(); 
} 
public void Show() { 
Console.WriteLine("Values are x: {0}, y: {1}", x, y); 
} 
public void Show1() { 
Console.WriteLine("Hello"); 
} 
} 
class InvokeMethDemo { 
static void Main() { 
Type t = typeof(MyClass); 
MyClass reflectOb = new MyClass(10, 20); 
int val; 
Console.WriteLine("Invoking methods in " + t.Name); 
Console.WriteLine(); 
MethodInfo[] mi = t.GetMethods(); 
// Invoke each method. 
foreach(MethodInfo m in mi) { 
// Get the parameters. 
ParameterInfo[] pi = m.GetParameters(); 
if(m.Name.Equals("Set", StringComparison.Ordinal) && 
pi[0].ParameterType == typeof(int)) { 
object[] args = new object[2]; 
args[0] = 9; 
args[1] = 18; 
m.Invoke(reflectOb, args); 
} 
else if(m.Name.Equals("Set", StringComparison.Ordinal) && 
pi[0].ParameterType == typeof(double)) { 
object[] args = new object[2]; 
args[0] = 1.12; 
args[1] = 23.4; 
m.Invoke(reflectOb, args); 
} 
else if(m.Name.Equals("Sum", StringComparison.Ordinal)) { 
val = (int) m.Invoke(reflectOb, null); 
Console.WriteLine("sum is " + val); 
} 
else if(m.Name.Equals("IsBetween", StringComparison.Ordinal)) { 
object[] args = new object[1]; 
args[0] = 14; 
if((bool) m.Invoke(reflectOb, args)) 
Console.WriteLine("14 is between x and y"); 
} 
else if(m.Name.Equals("Show", StringComparison.Ordinal)) { 
m.Invoke(reflectOb, null); 

} 
else if(m.Name.Equals("Show1", StringComparison.Ordinal)) { 
m.Invoke(reflectOb, null); 
}   
} 
} 
} 
  1. 是方法調用的基礎上的數量和參數類型passed.If是,那麼爲什麼

編譯器不顯示錯誤,因爲**相同的語句用於調用方法顯示並且

show1 **?

OR

  1. 方法基於的米(MethodInfo的米)一些基準值和 數量的參數調用。
+0

該方法僅基於MethodInfo調用。 – 2012-04-27 05:46:30

回答

1

您可以使用MethodBase類調用方法。

使用指定的參數調用當前實例表示的方法或構造函數。 請參閱此鏈接Method Invoking in Reflection