1

オブジェクトの配列、配列の内容の型をジェネリックとして取得し、各型を配信されたジェネリックにキャストしようとするメソッドを作成しました。

    public static void GetMultipleObjectsFromParameters<T, U>(
        object parameterArray, out T parameter1, out U parameter2)
    {
        parameter1 = default(T);
        parameter2 = default(U);

        try
        {
            object[] arr = parameterArray as object[];

            if (arr == null)
            {
                Debug.WriteLine("array not valid");
                return;
            }
            if (arr.Length != 2)
            {
                Debug.WriteLine("arr.Length != 2");
                return;
            }

            parameter1 = (T)arr[0];
            parameter2 = (U)arr[1];
        }
        catch (Exception ex)
        {
            Debug.Write(ex);
        }
    }

このメソッドは、BackgroundWorker を使用していて、異なる型の複数の引数を渡したい場合 (たとえば、最初のパラメーターを文字列、2 番目のパラメーターを整数など) に非常に役立つと考えました。

ここで、パラメーターの固定サイズを強制せずにこのメソッドを記述する方法があるかどうか疑問に思いました。これにより、パラメーターのカウントごとにこのようなメソッドを作成できなくなります。

質問がわかりやすかったことを願っています。簡単なアプローチはありますか?ご協力ありがとうございました。

4

2 に答える 2

5

編集:この回答は、その背後にある動機ではなく、元の質問に対処しています。仕事を etc に渡すという点ではBackgroundWorker、ラムダ式を使用することは完全に理にかなっています。

ここで、パラメーターの固定サイズを強制せずにこのメソッドを記述する方法があるかどうか疑問に思いました。

いいえ、そうではありません。あなたが探しているのは高次の型ですが、1と思いますが、.NETには存在しません(そのため、、などの「汎用アリティオーバーロード」が非常に多くあります)。Func<>Tuple<>Action<>


1正直なところ、私自身、これらのことについてあまり知りません。Joe Duffy のブログ記事は、私をやや驚かせますが、役に立つかもしれません。

于 2013-06-07T10:31:03.687 に答える
2

パラメータの固定サイズを強制せずにこのメソッドを記述する方法がある場合

パラメータの可変サイズでこのメソッドを記述する必要はありません。タプルが必要です:

        var myParams = Tuple.Create(100, "Hello, world!");
        var worker = new BackgroundWorker();

        worker.DoWork += (sender, args) =>
        {
            var arg = (Tuple<int, string>)args.Argument;
            if (arg.Item2.Length > 5)
            {
                var foo = arg.Item1 + 200;
            }

            // etc ...
        };

        worker.RunWorkerAsync(myParams);

またはクロージャ付きラムダ:

        var someIntParam = 100;
        var someStringParam = "Hello, world!";

        var worker = new BackgroundWorker();
        worker.DoWork += (sender, args) =>
        {
            if (someStringParam.Length > 5)
            {
                var foo = someIntParam + 200;
            }

            // etc ...
        };

        worker.RunWorkerAsync();

BackgroundWorker実際のコードでどのように使用するかによって異なります。

于 2013-06-07T10:39:50.640 に答える