C# 如何处理列表<;T>;那';它存储在一个对象中

C# 如何处理列表<;T>;那';它存储在一个对象中,c#,generics,C#,Generics,我正在为我的程序添加一些日志,以帮助跟踪函数调用和参数。为此,我创建了一个函数,该函数接受对象的参数数组,然后在运行时确定类型以定义如何处理每个对象。我遇到的问题是,如果我在参数[1]中有一个SqlParameter列表,我应该如何处理它,这样我就不需要定义可能传入的每种类型的列表了?对于列表中的每一项,我将调用ToString,这样我就不需要知道实际的类型。我在下面尝试将其转换为对象列表,但失败了 public static string LogParameters(params object

我正在为我的程序添加一些日志,以帮助跟踪函数调用和参数。为此,我创建了一个函数,该函数接受对象的参数数组,然后在运行时确定类型以定义如何处理每个对象。我遇到的问题是,如果我在参数[1]中有一个SqlParameter列表,我应该如何处理它,这样我就不需要定义可能传入的每种类型的列表了?对于列表中的每一项,我将调用ToString,这样我就不需要知道实际的类型。我在下面尝试将其转换为对象列表,但失败了

public static string LogParameters(params object[] parameters)
    {
        string returnValue = "\n";

        if (parameters != null)
        {
            for (int i = 0; i < parameters.Length; i++)
            {
                if (parameters[i] == null)
                {
                    returnValue += $"---->null null\n";
                }
                else if (parameters[i].GetType().IsGenericType)
                {
                    // error is happening on this line
                    List<object> objects = (List<object>)parameters[i];

                    returnValue += GetLogParameterTypeText(objects);

                    for (int x = 0; x < objects.Count; x++)
                    {
                        returnValue += GetLogParameterTypeText(objects[x], "----");
                    }
                }
                else if (parameters[i].GetType().IsArray)
                {
                    object[] objects = (object[])parameters[i];

                    returnValue += GetLogParameterTypeText(objects);

                    for (int x = 0; x < objects.Length; x++)
                    {
                        returnValue += GetLogParameterTypeText(objects[x], "----");
                    }
                }
                else
                {
                    returnValue += GetLogParameterTypeText(parameters[i]);
                }
            }
        }

        return returnValue;
    }
不要使用
列表
,使用
IEnumerable
。与列表不同,枚举允许类型差异,因此
list
实际上实现了
IEnumerable
,而它既不实现
list
也不实现
IList

为了获得额外积分,数组还实现了
IEnumerable
,因此您可以将逻辑更改为

if (parameters[i] is IEnumerable<object> enumerable)
{
  returnValue += GetLogParameterTypeText(enumerable);

  foreach (var object in enumerable) 
  {
    returnValue += GetLogParameterTypeText(object, "----");
  }
}
if(参数[i]是IEnumerable可枚举的)
{
returnValue+=GetLogParameterTypeText(可枚举);
foreach(枚举中的变量对象)
{
returnValue+=GetLogParameterTypeText(对象“----”);
}
}

您可能还想考虑使用<代码> StringBuilder <代码>来构建返回值;连接字符串需要更多的分配。

不要使用
列表
,使用
IEnumerable
。与列表不同,枚举允许类型差异,因此
list
实际上实现了
IEnumerable
,而它既不实现
list
也不实现
IList

为了获得额外积分,数组还实现了
IEnumerable
,因此您可以将逻辑更改为

if (parameters[i] is IEnumerable<object> enumerable)
{
  returnValue += GetLogParameterTypeText(enumerable);

  foreach (var object in enumerable) 
  {
    returnValue += GetLogParameterTypeText(object, "----");
  }
}
if(参数[i]是IEnumerable可枚举的)
{
returnValue+=GetLogParameterTypeText(可枚举);
foreach(枚举中的变量对象)
{
returnValue+=GetLogParameterTypeText(对象“----”);
}
}

您可能还想考虑使用<代码> StringBuilder <代码>来构建返回值;连接字符串需要更多的分配。

列表的
T
是否曾经是值类型,如
int
?@phoog我试图构建它来处理任何可能的情况。列表的
T
是否曾经是值类型,如
int
?@phoog我试图构建它来处理它任何情况都是可能的。如果列表的类型参数是值类型,这仍然不起作用。由于目标是对列表中的每个项目调用
ToString()
,因此使用
System.Collections.IEnumerable
而不是
System.Collections.Generic.IEnumerable
@phoog来处理您提到的情况更简单,因为我添加了
elseif(参数[I]是System.Collections.IEnumerable Enumerable enumerableValue)
谢谢你们两位的帮助!如果列表的类型参数是值类型,这仍然不起作用。由于目标是对列表中的每个项目调用
ToString()
,因此使用
System.Collections.IEnumerable
而不是
System.Collections.Generic.IEnumerable
@phoog来处理您提到的情况更简单,因为我添加了
elseif(参数[I]是System.Collections.IEnumerable Enumerable enumerableValue)
谢谢你们两位的帮助!