2015-03-03 5 views
2

Я делаю цикл 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 

ответ

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

2

Для того, для вызова с использованием параметров, выполните следующие действия:

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

значение parameters[4] будет изменено в соответствии с функция.

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]); 
    } 
} 
+0

Shaun - как вы делаете typeof (MyService) отражающим? поэтому я могу просто передать строку вместо этого typeof (MyService) –

+0

@Mike Хотя я не совсем уверен, что вы имеете в виду, возможно, вы могли бы использовать '(новый MyService()). GetType()', потому что он возвращает строку , –

+0

@Mike Что означает «отражающий»? –

Смежные вопросы