方法参数中的简单初始化器

本文关键字:初始化 简单 参数 方法 | 更新日期: 2023-09-27 18:05:22

我建立了这样一个流畅的界面:

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

我可以这样做吗?

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

我试图使用参数关键字使用方法:

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

但是我需要这样做:

criador.Include(new KeyValuePair<string, object>{"Idade", 21}, new KeyValuePair<string, object>{"Idade", 21});
关键是我不想在方法

方法参数中的简单初始化器

上写任何"new"关键字

可以使用隐式转换:

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) { ... }

每个方法执行不同的操作。不好的是,参数的最大数目是固定的。

很好,您可以优化每个函数的调用,从而提高性能。

如果需要,您还可以使用基类或接口的扩展方法来使用此技术。