0

私はこのような流暢なインターフェースを構築しました:

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});

重要なのは、メソッドに「新しい」キーワードを書きたくないということです。

4

3 に答える 3

1

暗黙の変換を使用できます。

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();
}
于 2011-08-13T14:54:08.963 に答える
0

もう1つの方法は、いくつかのオーバーロードを作成することです。必要なパラメーターの追加のカップルごとに1つのオーバーロードです。やり過ぎに思えるかもしれませんが、実際にはコードを非常に明確にすることができます。

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

各メソッドは異なる操作を実行します。悪いことに、パラメータの最大数は固定されています。

良いことに、各関数の呼び出しを最適化してパフォーマンスを向上させることができます。

必要に応じて、基本クラスまたはインターフェイスの拡張メソッドを使用してこの手法を使用することもできます。

于 2011-08-13T21:13:41.950 に答える
0

1つの方法は、Tuplesを使用することです。

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>直接使用することもできますが、目標は簡潔さであり、このような長い名前はあまり役に立ちません。)

于 2011-08-13T15:36:09.750 に答える