2014-06-25 71 views
1

我有一個對象數組,我想基於使用反射的方法的參數類型將這些對象轉換爲其實際類型。 字典將根據json字符串進行更改。因此,我想將對象數組設置爲適當的類型以傳遞invoke方法。使用反射基於參數類型轉換值

這是我的代碼。

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 

    string json [email protected]"{""Id"":21}"; 
    Dictionary<string, object> paramList = JsonConvert.DeserializeObject<Dictionary<string, object>>(json); 
      Assembly asm = Assembly.GetExecutingAssembly(); 
      Type jobType = (from t in asm.GetTypes() 
          where t.IsClass && t.FullName == "pathTest.Order" 
          select t).FirstOrDefault(); 
      MethodInfo infoMethod = jobType.GetMethod("GetOrder"); 
      object jobClassObject = asm.CreateInstance(jobType.FullName); 
      ParameterInfo[] parameters = infoMethod.GetParameters(); 
      int count = parameters.Count(); 
      Object[] pArray = { }; 

      if (count > 0) 
      { 
       pArray = new object[count]; 

       foreach (var methodArg in parameters) 
       { 
        var item = paramList.Where(m => m.Key == methodArg.Name).FirstOrDefault(); 


        pArray[methodArg.Position] = Int32.Parse(item.Value.ToString());//hard coded 

//Here I want to cast the value based on parameter type . 
//parameter type(item.Value.ToString()) 

       } 


      } 


      jobType.InvokeMember("GetOrder", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, jobClassObject, pArray); 

     } 
     catch (Exception e) 
     { 
     } 
     Console.ReadLine(); 
    } 
} 

回答

2

參數的實際類型存儲在methodArg.ParameterType中。您可以使用Convert.ChangeType更改從json字符串獲得的對象類型:

Type paramType = methodArg.ParameterType; 
pArray[methodArg.Position] = Convert.ChangeType(item.Value, paramType);