我正在对方法的参数进行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
答案 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.您需要指定任何正确类型的数组,或者根本不指定任何类型。
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]);
}
}