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);
谢谢你的建议,我确实试过了,可惜没有用。