高分求教:如何通过反射调用一个具有“被params关键字修饰的参数”的函数?

SmokerX 2008-01-21 05:14:40
定义了一个静态函数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可以接受任意个数的参数?
...全文
153 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengqscjh 2008-01-21
  • 打赏
  • 举报
回复
mark ,5,8楼的解决了
疯狂Rabbit 2008-01-21
  • 打赏
  • 举报
回复
5楼正解
ProjectDD 2008-01-21
  • 打赏
  • 举报
回复
应该没问题,反射方法的参数形式是
object[]
随便你是什么参数都可以.
LANXUEFEI 2008-01-21
  • 打赏
  • 举报
回复
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[]
如果你想写成第一也很简单,再加一个转换即可
SmokerX 2008-01-21
  • 打赏
  • 举报
回复
首先谢谢楼上的诸位朋友!

通常使用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会被反射成多种运行时函数,包括参数固定的和参数不固定的,因此我希望能以上面第一种形式调用。
春天的气息 2008-01-21
  • 打赏
  • 举报
回复
string[] parameters = new string[] { "desc1", "desc2", "desc3", "desc4" };

parameters 就只是一个参数而已,只不过这个参数的值是数组,并不代表参数就是数组,当然会出错的。

可以把这个参数就定义成数组了,而不是任意个参数。
LANXUEFEI 2008-01-21
  • 打赏
  • 举报
回复
不好意思写错了
object[] parameters = new object[] { new string[] { "desc1", "desc2", "desc3", "desc4" } };
LANXUEFEI 2008-01-21
  • 打赏
  • 举报
回复
object[] parameters = new string[] { new string[]{"desc1", "desc2", "desc3", "desc4" } };
LANXUEFEI 2008-01-21
  • 打赏
  • 举报
回复
string[] parameters = new string[] { "desc1", "desc2", "desc3", "desc4" };

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

SmokerX 2008-01-21
  • 打赏
  • 举报
回复
大哥!
null表示的是要在那个对象实例上调用该方法,我调用的是静态方法,当然不用给这个参数赋值了,VS的IDE弹出的智能感知的提示是“对于调用静态方法,此参数将被忽略”

也就是说,那个null并不是用来调用function的参数啊!
TNT_1st_excellence 2008-01-21
  • 打赏
  • 举报
回复
function.Invoke(null, parameters); 这种类型的
对应的反射函数是  functionName(XXXType 参数类型1, params string[] descs)
 

所以,
internal static string GetAllDesc(params string[] descs)
{
......
}
你这样写 function.Invoke(null, parameters); 不对!


110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧