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