11

简单的。如果我使用:

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()”构造的情况下做到这一点?

4

3 回答 3

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);
    }
}
于 2009-09-01T12:51:28.237 回答
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。

如果您将其用于测试,则这些更改不值得。这是一项相当大的努力,并且您更改了很多用于测试的生产代码。

于 2009-09-01T13:29:16.903 回答
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.
 }

如果参数的类型不正确,您应该添加一些错误处理。不是那么聪明,但它会起作用。

于 2009-09-01T12:56:21.593 回答