定义了一个静态函数GetAllDesc(),其参数个数是不固定的,如desc1,desc2,desc3...所以我给函数的参数加了params关键字:
internal static string GetAllDesc(params string[] descs)
{
......
}然后,在另一处通过反射调用该函数://反射得到运行时函数
string functionName = "GetAllDesc";
MethodInfo function = this.GetType().GetMethod(functionName);//准备参数数组
string[] parameters = new string[] { "desc1", "desc2", "desc3", "desc4" };//然后,调用运行时函数
function.Invoke(null, parameters);在这里发生异常,提示“参数个数不匹配”。
我觉得如果function不是运行时函数的话,就不会出现这个异常,因为function的参数已经采用了params关键字啊,这意味著不管调用者传给它多少个参数,它都应该照单全收。可是在运行时,CLR是不是认为string[]只代表一个参数,因此抛出异常呢?请教:应该怎样修改程序,才能让这个运行时的function可以接受任意个数的参数?

解决方案 »

  1.   

    function.Invoke(null,   parameters); 这种类型的
    对应的反射函数是  functionName(XXXType  参数类型1, params   string[]   descs)
     所以,
    internal   static   string   GetAllDesc(params   string[]   descs) 

    ...... 

    你这样写 function.Invoke(null,   parameters); 不对!
      

  2.   

    大哥!
    null表示的是要在那个对象实例上调用该方法,我调用的是静态方法,当然不用给这个参数赋值了,VS的IDE弹出的智能感知的提示是“对于调用静态方法,此参数将被忽略”也就是说,那个null并不是用来调用function的参数啊!
      

  3.   

    string[]   parameters   =   new   string[]   {   "desc1",   "desc2",   "desc3",   "desc4"   }; ---->string[]   parameters   =   new   string[]   {   new string[]{"desc1",   "desc2",   "desc3",   "desc4" } }; 
      

  4.   

     object[]       parameters       =       new       string[]       {       new   string[]{"desc1",       "desc2",       "desc3",       "desc4"   }   };   
      

  5.   

    不好意思写错了
     object[] parameters = new object[] { new string[] { "desc1", "desc2", "desc3", "desc4" } };
      

  6.   

    string[]   parameters   =   new   string[]   {   "desc1",   "desc2",   "desc3",   "desc4"   }; parameters  就只是一个参数而已,只不过这个参数的值是数组,并不代表参数就是数组,当然会出错的。可以把这个参数就定义成数组了,而不是任意个参数。
      

  7.   

    首先谢谢楼上的诸位朋友!通常使用Sql帮助类时,commandParameters是param修饰的参数,比方说:
    public static DataSet ExecuteDataSet(string connectionString, string cmdText, params SqlParameters[] commandParameters)
    {
    ......
    }然后,当我们调用的时候,只要把存储过程的参数一一列在后面就行了:
    SqlHelper.ExecuteDataSet(CONN_STRING, "sp_MyProcedureName", param1, param2, param3, ...);
    在这里我们并不需要写成下面的形式:
    SqlHelper.ExecuteDataSet(CONN_STRING, "sp_MyProcedureName", new SqlParameters[]{param1, param2, param3, ...});可是,在反射的运行时函数上,为什么就不能写成第一种形式呢?因为顶楼的那个function.Invoke会被反射成多种运行时函数,包括参数固定的和参数不固定的,因此我希望能以上面第一种形式调用。
      

  8.   

    SqlHelper.ExecuteDataSet(CONN_STRING,   "sp_MyProcedureName",   param1,   param2,   param3,   ...); 
    与SqlHelper.ExecuteDataSet(CONN_STRING,   "sp_MyProcedureName",   new   SqlParameters[]{param1,   param2,   param3,   ...});有什么区别呢?
    MethodInfo.Invoke(object obj,object[] parameters);
    parameters 
    调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型
    internal   static   string   GetAllDesc(params   string[]   descs) 

    ...... 

    中的descs是一个参数,类型是string[]
    如果你想写成第一也很简单,再加一个转换即可
      

  9.   

    应该没问题,反射方法的参数形式是
    object[]
    随便你是什么参数都可以.