将集合转换为对象[]

时间:2016-07-13 15:42:50

标签: c# reflection collections

我一直在寻找一种方法来将一个集合的项目(我还没有决定采用什么样的集合)移动到While not mandatory, it is highly recommended that you set a password for the MySQL administrative "root" user. If this field is left blank, the password will not be changed. New password for the MySQL "root" user: 。我正在尝试使用调用方法的参数(集合)作为调用方法的参数通过反射调用方法。

我有一些(UPDATE)方法,我希望通过REST api访问,而api又需要不同数量的参数。因此,我决定使用集合作为REST api的Object[]所需的参数之一。 但是因为我需要从反射中调用一个方法,所以我还需要以某种方式将该集合解析/转换为Update

这就是我现在所拥有的,如上所述,我似乎有点卡住......

另外,请记住,这不是关于如何设置REST服务(如我的其他)的问题,而是如何最好地将集合转换为正确的调用参数。此外,我们将非常感谢您对使用何种集合的任何帮助或建议。

Object[]

以下是我打算调用的两个方法示例:

public void Update(String proc, List<String> parameters)
{
    var myType = typeof(JaberoDC.JaberoDC.JaberoDC);
    var list = parameters;
    var method = myType
        .GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
        .Single(mi => string.Equals(mi.Name, proc, StringComparison.OrdinalIgnoreCase));
    var subject = Activator.CreateInstance(myType);
    var result = method.Invoke(subject, list);
}

1 个答案:

答案 0 :(得分:1)

假设您需要object[]作为Invoke的参数列表 - 在ToArray上调用IEnumerable<object>是一个选项 *

   List<string> parameters = new List<string>{"a","b"};
   var paramsAsObjects = parameters
        .Cast<object>() // need to cast each item from string to object
        .ToArray();

   methodWithTwoStringParam.Invoke(..., paramsAsObjects);

* 注意:Invoke要求数组中的项类型与参数类型相匹配。转换为object不会更改参数类型。如果你需要调用的方法采用不同的类型作为参数(即不是所有string),那么你需要坚持将参数传递给你的帮助器作为所有可能参数的基类型的集合。最有可能的是,您最终收集了object个元素 - 例如List<object>,或者只是避免所有转化,并构建object[]作为开头。

如果您的值从无类型字符串(即用户输入)开始,您可以考虑使用Convert.ChangeType代替Cast来尝试匹配参数类型。 ChangeType适用于字符串到数字类型的转换,如果您需要更复杂的类型 - 请使用您自己的转换逻辑。