日期:2014-05-20  浏览次数:20648 次

反射动态调用类方法的一个问题(返回参数 out)
相关代码如下:
public   static   object[]   FindFunction(string   methodName,   object[]   pr)
                {
                        Assembly   a   =   Assembly.LoadFrom(dllFilePath);//加载DLL
                        if   (a   ==   null)
                        {
                                throw   new   Exception( "Can 't   Find   The     File ");
                        }
                        object   o   =   a.CreateInstance( "namespace.class ");//寻找类
                        if   (o   ==   null)
                        {
                                throw   new   Exception( "Can 't   Create   The   Object ");
                        }
                        MethodInfo   m   =   o.GetType().GetMethod(methodName);//调用方法
                        if   (m   ==   null)
                        {
                                throw   new   Exception( "Can 't   Find   The   Method   of   "   +   methodName);
                        }
                        return   (object)m.Invoke(o,   pr);//执行
                }


以下是一个函数的原型:
public   static   int   CheckUserCanLogin(object   []   pr,   out   string   UserName)

以下是调用:
FindFunction( "CheckUserCanLogin ",   new   object[]   {   pr,   UserName   });

问题是:
怎么获取最后一个返回参数的值.

------解决方案--------------------
Invoke是支持ref/out调用参数的,问题是你的调用方法:

FindFunction( "CheckUserCanLogin ", new object[] { pr, UserName });
这时候UserName引用的一个copy被保留在new object[]数组里面,传递给CheckUserCanLogin。所以被改变的是这个在数组里面的饮用,不是UserName自己。

修改如下:
object[] params = new object[]{ pr, UserName };
FindFunction( "CheckUserCanLogin ", params);

UserName = params[1]; // <---- 保改变后得值copy回来