c# - 是否有通用方法来迭代和打印未知集合中的值?

标签 c# .net generics lambda expression-trees

比方说,我有一个这样的 Print 方法:

private static void Print(IEnumerable items)
{
    // Print logic here
}

我想将一个集合类传递给此 Print 方法,它应该像表格一样打印所有字段。例如,我的输入集合可以是“Persons”或“Orders”或“Cars”等。

如果我将“Cars”集合传递给 Print 方法,它应该打印“Car”详细信息列表,例如:品牌、颜色、价格、类别等。

直到运行时我才知道集合的类型。我尝试使用 TypeDescriptorsPropertyDescriptorCollection 实现了解决方案。但是,我认为这不是一个好的解决方案。有没有其他方法可以使用表达式或泛型来实现这一点?

最佳答案

你可以像这样实现打印:

static void Print<T>(IEnumerable<T> items)
{
    var props = typeof(T).GetProperties();

    foreach (var prop in props)
    {
        Console.Write("{0}\t", prop.Name);
    }
    Console.WriteLine();

    foreach (var item in items)
    { 
        foreach (var prop in props)
        {
            Console.Write("{0}\t", prop.GetValue(item, null));
        }
        Console.WriteLine();
    }
}

它只是循环遍历类的每个属性以打印属性的名称,然后打印每个项目并为每个项目打印属性的值。

我认为你应该在这里使用泛型(而不是其他答案中的建议);您希望集合中的项目属于单一类型,以便您可以打印表格标题。

对于表格格式,您可以查看 this question 的答案.

关于c# - 是否有通用方法来迭代和打印未知集合中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5113982/

相关文章:

Java 泛型警告需要大师冥想

c# - C# 中的冗余?

c# - 使用运行时类型执行的通用方法

c# - WQL Like 语句和语法

c# - 错误: C# Attempted to read or write protected memory

c# - 从序列末尾获取元素的linq扩展方法

.net - 为什么在尝试使用 Marshal.PtrToStructure 将字节数组转换为类实例时会出现访问冲突?

c# - 过滤数组列表内容的最佳方法是什么?

c# - 在 C# 中,希望命名空间是内部的有任何意义吗?

c# - 使用 Entity Framework 6 流式传输 varbinary(max) 数据