简单。如果我使用:
public void Add(params int[] values)
然后我可以用它作为:
Add(1, 2, 3, 4);
但现在我正在处理键值对!我有一个KeyValue类来将整数链接到字符串值。所以我从:
开始public void Add(params KeyValue[] values)
但我不能用这个:
Add(1, "A", 2, "B", 3, "C", 4, "D");
相反,我被迫使用:
Add(new KeyValue(1, "A"), new KeyValue(2, "B"), new KeyValue(3, "C"), new KeyValue(4, "D"));
Ewww ......我已经不喜欢这个......
所以,现在我使用不带params修饰符的Add函数,只是将一个预定义的数组传递给这个函数。因为它只是用于测试的快速初始化,所以我不需要太多麻烦需要这些额外的代码,尽管我想保持代码简单易读。我很想知道一个使用我不能使用的方法的技巧,但有没有办法在不使用“new KeyValue()”构造的情况下做到这一点?
答案 0 :(得分:23)
如果你接受IDictionary<int,string>
,你可能会使用(至少在C#3.0中):
Add(new Dictionary<int,string> {
{1, "A"}, {2, "B"}, {3, "C"}, {4, "D"}
});
有用吗?
示例Add
:
static void Add(IDictionary<int, string> data) {
foreach (var pair in data) {
Console.WriteLine(pair.Key + " = " + pair.Value);
}
}
答案 1 :(得分:3)
您可以修改当前的类设计,但需要添加泛型并使用IEnumerable接口。
class KeyValue<TKey, TValue>
{
public KeyValue()
{
}
}
// 1. change: need to implement IEnumerable interface
class KeyValueList<TKey, TValue> : IEnumerable<TKey>
{
// 2. prerequisite: parameterless constructor needed
public KeyValueList()
{
// ...
}
// 3. need Add method to take advantage of
// so called "collection initializers"
public void Add(TKey key, TValue value)
{
// here you will need to initalize the
// KeyValue object and add it
}
// need to implement IEnumerable<TKey> here!
}
添加完成后,您可以执行以下操作:
new KeyValueList<int, string>() { { 1, "A" }, { 2, "B" } };
编译器将使用IEnumerable接口和Add方法填充KeyValueList。请注意,它适用于C#3.0。
如果您将其用于测试,则这些更改不值得。这是一项非常努力的工作,您可以为测试更改大量的生产代码。
答案 2 :(得分:0)
你可以使用类似下面的东西,但明显的缺点就是你没有打字。
public void Add(params Object[] inputs)
{
Int32 numberPairs = inputs.Length / 2;
KeyValue[] keyValues = new KeyValue[numberPairs];
for (Int32 i = 0; i < numberPairs; i++)
{
Int32 key = (Int32)inputs[2 * i];
String value = (String)inputs[2 * i + 1];
keyvalues[i] = new KeyValue(key, value);
}
// Call the overloaded method accepting KeyValue[].
this.Add(keyValues);
}
public void Add(params KeyValue[] values)
{
// Do work here.
}
如果参数类型不正确,您应该添加一些错误处理。不是那么聪明,但它会起作用。