繁体   English   中英

Method.Invoke失败,参数计数不匹配

[英]Method.Invoke failing with Parameter Count Mismatch

我正在尝试调用通用方法。 该方法的定义如下:

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数组添加另一个对象也不起作用。

请帮忙!

谢谢,唐

对于不想为其指定值的可选参数,必须传递Type.Missing如下所示:

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

引用此参考文献

使用Missing字段通过反射进行调用以获得参数的默认值

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

可选参数只是语法糖,当您不提供可选参数时,编译器会使用给定的默认值调用该方法。 但是,如果是反射,则需要手动进行。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM