2016-01-22 288 views
2

我想調用一個通用的方法。該方法的定義如下:Method.Invoke失敗,參數計數不匹配

public System.Collections.Generic.IList<T> Query<T>(string query, [string altUrl = ""]) 
where T : new() 

這是來自github上的SalesforceSharp庫。我試圖在這個調用上增加一個服務層,並努力調用它。看到我的代碼如下。

public List<T> Query<T>() 
    { 
     //IList<Salesforce.Account> _returnList = null; 
     IList<T> _returnList = null; 
     Type _t = typeof(T); 

     SqlBuilder _sb = new SqlBuilder(); 
     _sb.Table = _t.Name.ToString(); 
     foreach (PropertyInfo p in _t.GetProperties()) _sb.Fields.Add(p.Name.ToString()); 

     MethodInfo method = _Client.GetType().GetMethod("Query"); 
     method = method.MakeGenericMethod(_t); 
     try 
     { 
      object[] _prms = new object[1]; 
      _prms[0] = _sb.SQL; 
      _returnList = (IList<T>)method.Invoke(_Client, new object[] { _prms }); 
      //_returnList = _Client.Query<Salesforce.Account>(_sb.SQL); 
     } 
     catch { } 
     return (List<T>)_returnList; 
    } 

如果我運行此我得到一個參數指望method.invoke線匹配異常,但我很困惑,因爲如果我在兩個註釋的行帶和執行不一般稱之爲好的工作。我已經嘗試了包裝在對象數組中的字符串數組,包含在字符串中的字符串等的許多組合,但無法實現。我想也許它把第二個參數當作強制性的?但添加另一個對象到我的_prms數組也沒有工作。

請幫忙!

感謝, 大教堂

回答

3

對於您不想爲指定值可選參數,你必須通過Type.Missing這樣的:

_returnList = (IList<T>)method.Invoke(_Client, new object[] { _sb.SQL, Type.Missing }); 

this reference報價:

使用Missing字段進行反射調用以獲取參數的默認值

另請注意,另一個問題是您目前正在傳遞object[]而不僅僅是查詢字符串。

1

可選參數只是語法上的糖,當您不提供可選參數時,編譯器將調用具有給定默認值的方法。但是在反射的情況下,你需要手動完成。

object[] _prms = new object[2]; 
_prms[0] = _sb.SQL; 
_prms[1] = ""; 
_returnList = (IList<T>)method.Invoke(_Client, _prms); 
+0

感謝您的建議,我確實嘗試過,可悲的是它沒有幫助。 –