Простые инициализаторы в параметрах метода
Я создал свободный интерфейс, как это:
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 ответа
Вы можете использовать неявное преобразование:
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();
}
Одним из способов было бы использовать 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>
напрямую, но я думаю, что ваша цель - краткость, что такое длинное имя не очень помогает.)
Другой способ - написать несколько перегрузок: одна перегрузка для каждой дополнительной пары необходимых параметров. Это может показаться излишним, но на самом деле может сделать код достаточно ясным.
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) { ... }
Каждый метод выполняет свою операцию. Плохая вещь, у вас есть фиксированное количество максимальных количеств параметров.
Хорошо, что вы можете оптимизировать вызов для каждой функции, увеличивая производительность.
Вы также можете использовать эту технику, используя методы расширений для базового класса или интерфейса, если это необходимо.