1

我在 C# 中有一个函数 void func(int x, int y, params object[] arr)

现在这个 arr 可以包含任何东西。例如,它可以在 [0] 处包含一个数组,在 [1] 处包含一个字符串等等。

如果我传递以下参数:func(3, 4, array1, list1, "hello");

array1 是一个 int 数组,list1 是一个 List

我的问题是如何从 arr 中提取 array1 和 list1 并将其转换为数组或列表?

4

6 回答 6

3
Array myArray = (Array) arr[0];
List<int> myList = (List<int>) arr[1];

或者

Array myArray = arr[0] as Array;
List<int> myList = arr[1] as List<int>;
于 2012-08-27T11:27:33.387 回答
3

您可以使用Type.IsArray属性

public static void func(int x, int y, params object[] arr)
{
    var test = arr.Where(r => r.GetType().IsArray);
}

你这样称呼它:

 int[] arr = new int[] {1,2,3};
 func(1, 2, 2, 4, arr);
于 2012-08-27T11:31:32.193 回答
1
var items = arr.Where(x => x.GetType() == typeof(IEnumerable<object>));
foreach (var item in items)
{
    if (item is List<object>) 
    {
        (item as List<object>).Add("test123");
    }
    else if (item is object[]) {...}
}

这样的事情应该是一个解决方案。

于 2012-08-27T11:28:09.980 回答
1

你可以做

void func(int xx, int yy, params object[] arr)
    {
        object value = arr[0];
        Type valueType = value.GetType();
        if (valueType.IsArray)
        {
            Array myArray = (Array)arr[0];
        }

        value = arr[1];
        valueType = value.GetType();
        if (valueType.IsGenericType)
        {
            List<int> myList = (List<int>) arr[1];
        }        
    }
于 2012-08-27T11:39:44.650 回答
1

这是一个小程序。您已经提到 arr 可以由任何东西组成,所以我假设在第一个索引上可以有 List、数组、字符串或其他任何东西,并且可以传递许多数组或列表。
因此,您可能不应该假设在特定索引上您可以预期特定类型的元素。此解决方案将从 arr 中提取所有数组和所有列表。也许它对你有用。

class Program
{
    static void Main(string[] args)
    {
        int[] array1 = new int[10];
        var list1 = new List<int>() { 0, 1, 52 };
        var list2 = new List<string>() { "Mike" };

        func(3, 4, array1, list1, "hello", list2);

    }

    static void func(int x, int y, params object[] arr)
    {
        // Gets all lists and arrays from arr
        IEnumerable<object> listsAndArrays = arr.Where(a => a is IList);
        // Gets all arrays from arr
        IEnumerable<object> arrays = arr.Where(a => a is Array);
        // Gets all lists from arr
        IEnumerable<object> lists = arr.Where(a => a.GetType().IsGenericType && a.GetType().GetGenericTypeDefinition() == typeof(List<>));
    }
}
于 2012-08-27T12:01:46.570 回答
0

如果我说对了:

    void func(int x, int y, params object[] arr)
    {
        foreach (var a in arr)
        {
            if (a.GetType().IsArray)
            {
                var internalArray = ((Array)a).OfType<object>().ToArray();
                Console.WriteLine(internalArray[0]);
            }
            else if (a is IList)
            {
                var internalList = (IList)a;
                Console.WriteLine(internalList[0]);
            }
        }
    }
于 2012-08-27T11:41:20.627 回答