Простые инициализаторы в параметрах метода - PullRequest
0 голосов
/ 13 августа 2011

Я создал свободный интерфейс, подобный этому:

criador.Include("Idade", 21).Include("Idade", 21);

Могу ли я сделать что-то вроде этого:

criador.Include({"Idade", 21},{"Idade", 21});

Я попытался использовать метод пользователя с ключевым словом params:

public myType Include(params[] KeyValuePair<string,object> objs){
    //Some code
}

Но мне нужно сделать это:

criador.Include(new KeyValuePair<string, object>{"Idade", 21}, new KeyValuePair<string, object>{"Idade", 21});

Дело в том, что я не хочу писать "новые" ключевые слова для методов

Ответы [ 3 ]

1 голос
/ 13 августа 2011

Вы можете использовать неявное преобразование:

public class ConvertibleKeyValuePair
{
    public ConvertibleKeyValuePair(string key, int value)
    {
        _key = key;
        _value = value;
    }

    public static implicit operator ConvertibleKeyValuePair(string s)
    {
        string[] parts = s.Split(';');
        if (parts.Length != 2) {
            throw new ArgumentException("ConvertibleKeyValuePair can only convert string of the form \"key;value\".");
        }
        int value;
        if (!Int32.TryParse(parts[1], out value)) {
            throw new ArgumentException("ConvertibleKeyValuePair can only convert string of the form \"key;value\" where value represents an int.");
        }
        return new ConvertibleKeyValuePair(parts[0], value);
    }

    private string _key;
    public string Key { get { return _key; } }

    private int _value;
    public int Value { get { return _value; } }

}

// Тесты

private static ConvertibleKeyValuePair[] IncludeTest(
    params ConvertibleKeyValuePair[] items)
{
    return items;
}

private static void TestImplicitConversion()
{
    foreach (var item in IncludeTest("adam;1", "eva;2")) {
        Console.WriteLine("key = {0}, value = {1}", item.Key, item.Value);
    }
    Console.ReadKey();
}
0 голосов
/ 14 августа 2011

Другой способ - записать несколько перегрузок: одну перегрузку для каждой дополнительной пары требуемых параметров.Это может показаться излишним, но на самом деле может сделать код достаточно ясным.

public void Include(string k0, object v0) { ... }
public void Include(string k0, object v0, string k1, object v1) { ... }
public void Include(string k0, object v0, string k1, object v1, string k2, object v2) { ... }
public void Include(string k0, object v0, string k1, object v1, string k2, object v2, string k3, object v3) { ... }
public void Include(string k0, object v0, string k1, object v1, string k2, object v2, string k3, object v3, string k4, object v4) { ... }

Каждый метод выполняет свою операцию.Плохая вещь, у вас есть фиксированное количество максимальных количеств параметров.

Хорошая вещь, вы можете оптимизировать вызов для каждой функции, увеличивая производительность.

Вы также можете использовать эту технику, используя методы расширенийдля базового класса или интерфейса, если необходимо.

0 голосов
/ 13 августа 2011

Один из способов будет использовать Tuple s:

criador.Include(Tuple.Create("Idade", 21), Tuple.Create("Idade", 21));

Или вы можете создать тип, который может содержать значения:

criador.Include(new StrIntDict{ {"Idade", 21}, {"Idade", 21} });

Где StrIntDict в основном Dictionary<string, int>: он должен реализовывать IEnumerable и иметь метод Add(string, int). (Вы можете использовать Dictionary<string, int> напрямую, но я думаю, что ваша цель - краткость, что такое длинное имя не очень помогает.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...