2016-01-14 27 views
1

我想在class1 dynamically中調用method1。我不想直接使用Prm class。如何發送p parameter dynamicallyHere是一種方式,但我could'nt管理方法動態調用複雜參數(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名稱作爲字符串。並且有參數列表。我想動態地調用method1。 –

回答

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()創建實例並設置值 –