2016-01-14 3 views
1

Я хочу вызвать method1 в class1 dynamically. Я не хочу напрямую использовать Prm class. Как отправить p parameter dynamically. Here это способ, но я could'nt управлятьМетод Invoke со сложным параметром динамически (C#)

namespace WindowsFormsApplicationMethodCall 
{ 
    public class Prm 
    { 
     public string p1 { get; set; } 
     public long p2 { get; set; } 
    } 
    public class Class1 
    { 
     public string Method1(Prm p) 
     { 
      return "Hello world"; 
     } 
    } 
} 

использование:

private void button1_Click(object sender, EventArgs e) 
{ 
    var ass = Assembly.LoadFrom("abc.dll"); 
    var business = ass.CreateInstance("WindowsFormsApplicationMethodCall.Class1"); 
    var mInfo = business.GetType().GetMethod("Method1"); 
    var anonymParameter = new { p1 = "", p2 = 2 }; 
    mInfo.Invoke(business,new object[]{ anonymParameter}); 
    //var res = mInfo.TolerantCast(new { p1 = "", p2 = 2 }); 
    //var param = new Dictionary<string,object>(); 
    //param.Add("p", result);     
} 

Я нашел эту ошибку: Объект типа <>f__AnonymousType0`2[System.String,System.Int32] не может быть преобразовано в тип

+0

должен создать параметр объекта же типа PRM этот код создать анонимный объект «вар anonymParameter = new {p1 = "", p2 = 2}; " –

+3

C# /. Net - безопасный тип. Функции принимают только объекты Prm, поэтому вам нужно передать объект Prm. – thehennyy

+0

Я знаю это. На самом деле у меня есть имена методов, классов и dll в виде строки. И есть параметры как Список . И я хочу динамически вызывать метод1. –

ответ

1

Вам нужно пройти объект типа Prm:

var parameter = new Prm { p1 = "", p2 = 2 }; 
mInfo.Invoke(business,new object[]{ parameter }); 
2

Создание экземпляра из класса "Prm" и использовать его вместо

var anonymParameter = new { p1 = "", p2 = 2 }; 

в

var anonymParameter = ass.CreateInstance("WindowsFormsApplicationMethodCall.Prm"); 
anonymParameter.GetType().GetProperty("p1").SetValue(anonymParameter,""); 
anonymParameter.GetType().GetProperty("p2").SetValue(anonymParameter,2); 
+0

есть. Я создаю экземпляр и устанавливаю значение через GetPropeties() и SetValue() –

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