我想你想要这样的东西:
public class Program
{
public static void PrintProperties<T>(T t)
{
var properties = t.GetType().GetProperties();
foreach (var property in properties)
{
var name = property.Name;
var value = property.GetValue(t, null);
if (property.PropertyType.IsGenericType && property.PropertyType == typeof(IEnumerable<>))
{
var formatList = typeof(Program).GetMethod("FormatList", new[] { value.GetType() });
// value.GetType().GetGenericArguments().First() will get you the underlying type of the list,
// i.e., the TItemType where the property you are currently
// handling is of type IEnumerable<TItemType>
formatList.MakeGenericMethod(value.GetType().GetGenericArguments().First());
value = formatList.Invoke(null, new object[] { value });
Console.Out.WriteLine(name + ": " + value);
}
else
{
Console.Out.WriteLine(name + ": " + value);
}
}
}
public static string FormatList<TPlaceholder>(IEnumerable<TPlaceholder> l)
{
return string.Join(", ", l);
}
}
该代码未经测试,但基本上,与标量值相比,您希望以不同的方式处理可枚举类型,因此一旦您遇到 type 的某些内容IEnumerable<TItemType>
,您就可以调用该FormatList<TPlaceholder>
方法。
现在,请记住,您的原始T
和TItemType
不一定相同。当您使用反射调用 FormatList 时,您希望将其绑定TPlaceholder
到TItemType
. 完成后,您只需调用格式化方法并将列表的实际实例传递给它,它会返回一个字符串。然后你可以输出那个字符串。
希望有帮助。