Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “为什么?”;参数对象[]”;需要传递为;新对象[]{parameters}";对于Com方法?_C#_Object_Parameters_Com_Codedom - Fatal编程技术网

C# “为什么?”;参数对象[]”;需要传递为;新对象[]{parameters}";对于Com方法?

C# “为什么?”;参数对象[]”;需要传递为;新对象[]{parameters}";对于Com方法?,c#,object,parameters,com,codedom,C#,Object,Parameters,Com,Codedom,我发现了很多关于向方法传递参数的信息,并发现让方法使用params Object[]args是一种很好的(有时是唯一的)方法 i、 e.抽样方法: public void someMethod(params object[] args) { //do something } 但是当像这样将参数对象传递给Com方法时,它不起作用: object[] passParameters = new object[2]; passParameters[0] = "test1"; passPar

我发现了很多关于向方法传递参数的信息,并发现让方法使用
params Object[]args
是一种很好的(有时是唯一的)方法

i、 e.抽样方法:

public void someMethod(params object[] args)
{
      //do something
}
但是当像这样将参数对象传递给Com方法时,它不起作用:

object[] passParameters = new object[2];
passParameters[0] = "test1";
passParameters[1] = "test2";

//Calling method compiled with with CodeDom
MethodInfo method = classObject.GetType().GetMethod("someMethod");
object dynamicOutput = method.Invoke(classObject, passParameters);
要使其工作,我发现需要将参数对象作为新对象传递:

object dynamicOutput = method.Invoke(classObject,(new object[] { passParameters });

谁能给我解释一下为什么我需要这样做,以及背后的原因是什么?谢谢。

他们没有。你可以把它们当作

someMethod("test1", "test2", ... )

但是。如果您事先创建了一个数组,则必须以不同的方式传递它,正如您遇到的那样

我逐渐意识到,示例中的原始
passParameters
对象包含两个元素,我们知道:

passParameters[0] = "test1";
passParameters[1] = "test2";
但是,当将数组传递给Com方法时,它需要按如下方式传递:

new object[] { passParameters })
我的理解是,它创建了一个新的对象数组,将现有的“passParameters”数组放入其第一个元素[0](有效地创建了一个新的2d数组):


我的问题中的方法
MethodInfo
类需要将单个对象传递给
Invoke
方法,这意味着原始的“passParameters”对象及其两个元素有太多的参数。通过将其传递到一个新对象中,这会将所有元素作为单个对象传递,但包含这些参数的数组。

那么首先为什么要使用
params
——这忽略了它的全部要点。不过,您的第一个示例确实有效。你收到错误信息了吗?我没有收到错误<代码>某些方法(密码参数)工作正常。或者您希望数组作为单个对象传递吗?我的水晶球说您忘了告诉我们“someMethod”实际上是一个COM接口方法,它的参数是ByRef传递的。
passParameters[0][0] = "test1";
passParameters[0][1] = "test2";