Sandy8606

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

先来看一个类:

    public class ReflectDemoClass
{
public static void M(string s,out int i)
{
i
= 1;
Console.WriteLine(
"s={0},i={1}",s,i);
}

public static void M(string s, double i)
{
Console.WriteLine(
"s={0},i={1}", s, i);
}
}

首先,利用反射获取此类的Type:Type T = Type.GetType("ReflectDemoClass"); 这个没问题,很简单,

接下来就有点麻烦了 获取此类的第一个M方法:MethodInfo method =T.GetMethod("M", new Type[] { typeof(String), typeof(Int32).MakeByRefType() });

这里面的MakeByRefType()方法很重要,没有的话会导致调用结果出乎你的意料(i=1;貌似不会执行)

 最后就是调用了,方法需要两个参数,第一个参数是 string类型 没什么说的, 第二个参数是 out int,先以以下方式调用:

   Int32 i = 0;
method.Invoke(
null, new object[] {"Hello world",i });
Console.WriteLine(
"i={0}", i);

结果如下:

s=Hello world,i=1
i=0

 

i=0 肯定不是我想要的结果,但是又不知道怎么在new object[]中传入out i,无奈之下 只能采用以下方式调用:

Int32 i = 0;
object[] obs=new object[] { "aaaaa", i};
method.Invoke(
null, obs);
i
= (Int32)obs[1];
Console.WriteLine(
"i={0}",i);

结果如下:

s=aaaaa,i=1
i=1
除了最后那条输出语句,i经历了一次装箱和拆箱,method.Invoke调用M方法的时候要把oject转成Int32(个人认为),也会拆箱一次。效率上肯定会有所降低。

以上都是个人的拙见,希望能有高手给出更好的建议。

posted on 2011-08-11 15:33  Sandy8606  阅读(1088)  评论(0编辑  收藏  举报