在c#中使用未知的amout参数调用函数

时间:2015-10-25 01:45:49

标签: c# params

我有一个功能

public static SomeFunction(string a, string b = "", string c = "", string d = "")
{
return a + b + c + d;
}

我有一个未知数量的字符串(1-4)存储在列表中(也可以不同方式存储)。

即使我实际上不知道列表中有多少项,我如何使用字符串调用SomeFunction()?

该功能已给出且无法更改。

5 个答案:

答案 0 :(得分:3)

嗯,简单的事就是把它包起来:

string MyFunctionEx(IList<string> values) {
   switch (values.Length) {
       case 1:
          return MyFunction(values[0]);
       case 2:
          return MyFunction(values[0], values[1]);
       case 3:
          return MyFunction(values[0], values[1], values[2]);
       case 4:
          return MyFunction(values[0], values[1], values[3], values[4]);
       break:
          throw new InvalidOperationException();
}

据推测,你正在寻找比这更通用的东西?那么,在这种情况下,我通常会说dynamic将是要走的路 - 不幸的是,因为这是static方法,你没有那么奢侈,必须使用反射。需要注意的一点是,仍然需要传递可选参数,但应该是Type.Missing

object[] parameters = new object[4];
for (var i = 0; i < parameters.Length; i++) {
     parameters[i] = i < myList.Count ? myList[i] : Type.Missing;
}
MethodInfo mi = typeof(SomeClass).GetMethod(nameof(SomeClass.SomeFunction));
string result = (string)mi.Invoke(null, parameters);

答案 1 :(得分:2)

如果是这样的话,你的功能会更好:

char *str = "Hello, world!";
int start = 4;
int end = 7;
int len = end-start+1;
char *str2 = new char[len+1];
memcpy(str2, str1+start, len);
str2[len] = '\0';

然后可以传递public static string SomeFunction(IEnumerable<string> values) { return string.Concat(values); } List<string>或其他可枚举的字符串并将其连接起来,尽管通过向string.Concat添加一个抽象层实际上并没有做太多工作,所以我完全放弃了这个功能,在这种情况下只使用内置函数。

修改

如果无法像你说的那样修改方法,那么还有另一种选择,你可以这样做:

string[]

基本上这里发生的是你将public static string SomeFunctionInvoker(IEnumerable<string> values) { var listStr = values.ToArray(); //<-- Requires System.Linq if (listStr.Length > 4) throw new ArgumentException("Too many arguments provided"); if (listStr.Length == 0) throw new ArgumentException("Not enough arguments provided"); string[] strArray4 = new string[4]; Array.Copy(listStr, strArray4, listStr.Length); return SomeFunction(strArray4[0], strArray4[1], strArray4[2], strArray4[3]); } 传递给调用函数,该函数确保参数的数量适合IEnumerable<string>参数列表。然后它创建一个具有最大参数数量的数组,将原始数组复制到其中,然后将所有参数传递给SomeFunction

仅当SomeFunction的默认参数使用SomeFunctionstring.Empty作为默认值时才有效。如果它有其他默认值then the only way to get the default values and pass them in without knowing at compile time is to use reflection

答案 2 :(得分:1)

void SomeFunction(params string[] val)允许您传递任意数量的字符串参数,这些参数从函数内部看作一个数组。如果您想要传递任何内容,可以在object[]关键字后使用params

答案 3 :(得分:1)

这个怎么样?

    List<string> list = new List<string> { "aaa", "bbb" };

    switch(list.Count){
        case 1: SomeFunction(list[0]);break;
        case 2: SomeFunction(list[0], list[1]);break;
        case 3: SomeFunction(list[0], list[1], list[2]);break;
        case 4: SomeFunction(list[0], list[1], list[2], list[3]);break;
        default: throw new ArgumentException("List length out of range");
    }

答案 4 :(得分:0)

假设+你的意思是加入而不是将它们添加为数字我会推荐一些快速简单的东西:

public string joinMyStrings(List<string> values) 
{
     return string.Join("", values);  // add any dividers if wanted
}