2012-04-27 119 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