C# 方法。调用失败,参数计数不匹配

C# 方法。调用失败,参数计数不匹配,c#,generics,reflection,C#,Generics,Reflection,我试图调用一个泛型方法。该方法的定义如下: public System.Collections.Generic.IList<T> Query<T>(string query, [string altUrl = ""]) where T : new() public System.Collections.Generic.IList查询(字符串查询,[string altUrl=”“]) 其中T:new() 这是来自github上的SalesforceSharp库。我正试

我试图调用一个泛型方法。该方法的定义如下:

public System.Collections.Generic.IList<T> Query<T>(string query, [string altUrl = ""])
where T : new()
public System.Collections.Generic.IList查询(字符串查询,[string altUrl=”“])
其中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;
    }
公共列表查询()
{
//IList _returnList=null;
IList _returnList=null;
类型_t=类型(t);
SqlBuilder _sb=新的SqlBuilder();
_sb.Table=\u t.Name.ToString();
foreach(PropertyInfo p in_t.GetProperties())\u sb.Fields.Add(p.Name.ToString());
MethodInfo方法=_Client.GetType().GetMethod(“查询”);
method=method.MakeGenericMethod(\u t);
尝试
{
object[]_prms=新对象[1];
_prms[0]=\u sb.SQL;
_returnList=(IList)方法。Invoke(_Client,new object[]{u prms});
//_returnList=\u Client.Query(\u sb.SQL);
}
捕获{}
返回(列表)\返回列表;
}
如果我运行这个命令,我会在method.invoke行上得到一个参数计数不匹配的异常,但是我很困惑,因为如果我引入两个未注释的行并在没有泛型调用的情况下执行,那么它工作正常。我已经尝试了很多组合,包括对象数组中的字符串数组、字符串中的字符串等等,但都没有成功。我想可能是把第二个参数当作强制性的?但是向我的_prms数组添加另一个对象也不起作用

请帮忙

谢谢,
Dom

对于不希望为其指定值的可选参数,必须传递
类型。缺少类似以下内容的

_returnList = (IList<T>)method.Invoke(_Client, new object[] { _sb.SQL, Type.Missing });
\u returnList=(IList)方法。Invoke(_Client,新对象[]{{u sb.SQL,Type.Missing});
引述自:

使用缺少的字段进行反射调用,以获取参数的默认值


另请注意,另一个问题是,您当前传递的是一个
对象[]
,而不仅仅是查询字符串。

当您不提供可选参数时,编译器将使用给定的默认值调用该方法。但在反射的情况下,您需要手动执行

object[] _prms = new object[2];
_prms[0] = _sb.SQL;
_prms[1] = "";
 _returnList = (IList<T>)method.Invoke(_Client, _prms);
object[]_prms=新对象[2];
_prms[0]=\u sb.SQL;
_prms[1]=“”;
_returnList=(IList)方法。Invoke(_Client,_prms);

谢谢你的建议,我确实试过了,可惜没有用。