利用反射来调用一个类的带有out关键字参数的方法
先来看一个类:
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(个人认为),也会拆箱一次。效率上肯定会有所降低。
以上都是个人的拙见,希望能有高手给出更好的建议。
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架