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 并希望提供多个不同类型的参数(例如第一个参数为字符串,第二个参数为整数......),此方法可能非常有用。

现在我只是想知道是否有一种方法可以编写此方法而无需强制使用固定大小的参数。这将阻止我为每个参数计数编写这样的方法。

我希望这个问题是可以理解的。有没有简单的方法?谢谢您的帮助。

4

2 回答 2

5

编辑:这个答案解决了原始问题,而不是其背后的动机。在将工作传递给BackgroundWorker等方面,使用 lambda 表达式非常有意义。

现在我只是想知道是否有一种方法可以编写此方法而无需强制使用固定大小的参数。

不,恐怕不是。您正在寻找的是高阶类型,我认为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);

或带有闭包的lambda

        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 回答