C#: 将集合转换为params[]

10

这是我代码的一个简化版本:

void Foo(params object[] args)
{
    Bar(string.Format("Some {0} text {1} here {2}", /* I want to send args */);
}

string.Format 要求用 params 传递参数。有没有办法将 args 集合转换为 string.Format 方法的参数?


你没有指定args的类型。 应该是params string[] args。 除此之外,你可以将它作为普通数组传递。 params只是一个编译器关键字,用于从发送的参数构建数组。 - HuBeZa
@HuBeZa:他已经指定了类型:它是“object”。为什么他要限制自己只使用字符串参数呢? - ChrisWue
@Chris,我的浏览器或者我的眼睛出了问题。我可以发誓那是 void Foo(params args[])。我需要休假 :) - HuBeZa
1
@HuBeZa 呵呵,你没错,是我一开始犯了个错误,后来通过编辑问题进行了更正 :) 不过休假总是一个好主意 :) - Ilya Kogan
3个回答

13
params 关键字只是一种“语法糖”,它允许你使用任意数量的参数调用这样的方法。然而,这些参数总是作为一个数组传递给该方法。
这意味着 Foo(123, "hello", DateTime.Now) 等同于 Foo(new object[] { 123, "hello", DateTime.Now })
因此,你可以直接将来自 Foo 的参数传递给 string.Format,像这样:
void Foo(params object[] args)
{
  Bar(string.Format("Some {0} text {1} here {2}", args));
}

然而,在这种情况下,你需要三个参数(因为在你的格式中有{0}、{1}和{2})。因此,你应该将你的代码更改为:

void Foo(object arg0, object arg1, object arg2)
{
  Bar(string.Format("Some {0} text {1} here {2}", arg0, arg1, arg2));
}

或者按照Marcelo的建议进行操作。


4
将它们作为单个参数传递:
Bar(string.Format("Some {0} text {1} here {2}", args));

0
你可以尝试使用 object.GetType(),例如:
void Foo(params object[] args)
    {
        List<string> argStrings = new List<string>();

        foreach (object arg in args)
        {
            if (args.GetType().Name == typeof(String).Name)
            {
                argStrings.Add((string)arg);
            }
            else if (args.GetType().Name == typeof(DateTime).Name)
            {
                DateTime dateArg = (DateTime)arg;
                argStrings.Add(dateArg.ToShortDateString());
            }
            else
            {
                argStrings.Add(arg.ToString());
            }
        }

        Bar(string.Format("Some {0} text {1} here {2}", argStrings.ToArray()));
    }

这与我所问的无关,但感谢您的尝试。顺便说一下,没有必要比较类型名称,您只需检查 if (arg is DateTime) 等即可。 - Ilya Kogan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接