Dom*_*ton 4 c# generics reflection
我正在尝试调用通用方法。该方法的定义如下:
public System.Collections.Generic.IList<T> Query<T>(string query, [string altUrl = ""])
where T : new()
Run Code Online (Sandbox Code Playgroud)
这是来自 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;
}
Run Code Online (Sandbox Code Playgroud)
如果我运行这个,我会在 method.invoke 行上收到参数计数不匹配异常,但我很困惑,因为如果我引入两个未注释的行并在没有通用调用的情况下执行,它就可以正常工作。我已经尝试了许多包装在对象数组中的字符串数组、字符串中的字符串等的组合,但无法让它运行。我想也许它把第二个参数视为强制性的?但向我的 _prms 数组添加另一个对象也不起作用。
请帮忙!
谢谢,多姆
对于您不想指定值的可选参数,您必须Type.Missing像这样传递:
_returnList = (IList<T>)method.Invoke(_Client, new object[] { _sb.SQL, Type.Missing });
Run Code Online (Sandbox Code Playgroud)
引用此参考文献:
使用Missing字段通过反射调用获取参数的默认值
另请注意,另一个问题是您当前传递的是查询字符串,object[]而不仅仅是查询字符串。