我在 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 并将其转换为数组或列表?
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>;
您可以使用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);
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[]) {...}
}
这样的事情应该是一个解决方案。
你可以做
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];
}
}
这是一个小程序。您已经提到 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<>));
}
}
如果我说对了:
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]);
}
}
}