按名称创建和传递参数

时间:2015-03-03 02:59:11

标签: c# reflection

我正在对方法的参数进行foreach循环。

MethodInfo objMethoda = typMyService.GetMethod(
                                        "GetBySystemWarrantyId",
                                        Type.EmptyTypes);
ParameterInfo[] pars = objMethoda.GetParameters();
foreach (ParameterInfo p in pars)
    Console.WriteLine("{0} {1}",p.ParameterType , p.Name);

当我尝试调用它时,我得到的参数不匹配。

我的方法有5个参数:

 System.String whereClause
 System.String orderBy
 System.Int32 start
 System.Int32 pageLength
 out System.Int32& totalCount

我可以创建这些参数并将其传递给方法吗?

var dataTableObjecta = objMethoda.Invoke(oMyServicea, null);

例如:参数与上述顺序相同,为

"1=1"
""
0
100000
out totalCount

3 个答案:

答案 0 :(得分:2)

看一下下面的例子

方法

public void GetBySystemWarrantyId(string whereClause, string orderBy, int start, int end, out int totalCount )
{
    totalCount = 3;
}

用法

MethodInfo objMethoda = this.GetType().GetMethod("GetBySystemWarrantyId");
int cnt = 0;
object[] parameters = {"1=1", "", 0, 100000, cnt};
objMethoda.Invoke(this, parameters);
int parsedNumber = (int)parameters[4];

我发现如果您不将参数作为预先声明的对象数组传递,而仅仅是如下所示

objMethoda.Invoke(this, new object[] { "1=1", "", 0, 100000, cnt });

返回值未存储在cnt

答案 1 :(得分:2)

要使用参数调用,请执行以下操作:

var parameters = new [] {"1=1", "", 0, 100000,  totalCount};
var dataTableObjecta = objMethoda.Invoke(oMyServicea, parameters);

parameters[4]的值将根据功能进行更改。

答案 2 :(得分:1)

您指定了错误的方法签名。 Type.EmptyTypes indicates a method with no parameters.您需要指定任何正确类型的数组,或者根本不指定任何类型。

Here it is as a DotNetFiddle

using System;
using System.Reflection;

public class MyService
{
    public void GetBySystemWarrantyId(string whereClause, string orderBy, 
        int start, int pageLength, out int totalCount)
    {
        totalCount = 1234567890;
    }
}

public class Program
{
    public static void Main()
    {
        MethodInfo objMethoda = typeof(MyService)
             .GetMethod("GetBySystemWarrantyId", new Type[]
             {
                typeof (string), typeof (string), 
                typeof (int), typeof (int), typeof (int).MakeByRefType()
             });

        MethodInfo objMethodb = typeof(MyService)
             .GetMethod("GetBySystemWarrantyId");

        int count= -1;
        object[] args = new object[] { "", "", 1, 1, count };

        objMethoda.Invoke(new MyService(), args);
        Console.WriteLine(args[4]);

        objMethodb.Invoke(new MyService(), args);
        Console.WriteLine(args[4]);
    }
}