如何打印对象的所有属性值而无需显式命名属性

3

如何遍历 List<Galaxy> 并打印出每个属性的值,而不必显式地写出属性名?

例如,我使用以下代码来写入 galaxy 的所有属性值:

private static void IterateThroughList()
{
    var theGalaxies = new List<Galaxy>
    {
        new Galaxy() { Name = "Tadpole", MegaLightYears = 400},
        new Galaxy() { Name = "Pinwheel", MegaLightYears = 25}
    };

    foreach (Galaxy theGalaxy in theGalaxies) 
    {
        // this part is of concern
        Console.WriteLine(theGalaxy.Name + "  " + theGalaxy.MegaLightYears);
    }
}

我试图避免在这行代码中使用明确的属性名称。
Console.WriteLine(theGalaxy.Name + "  " + theGalaxy.MegaLightYears);

因此,如果我的Galaxy类有比NameMegaLightYears更多的属性,它也会自动打印它们。

“Galaxy”是什么样子的?你能给我们展示一下吗? - MethodMan
1
你不想特别调用“Name”吗?你是什么意思? - Hemisphera
2
我完全不明白你的问题。你所说的“调用每个元素名称”是什么意思?你是在问如何编写一个foreach循环,同时省略循环变量(这里是Galaxy theGalaxy)的声明吗? - senshin
所以我不是唯一一个没有理解这个问题的人! - Arghya C
1
我认为他想知道如何遍历列表并打印每个对象包含的每个属性的值,而无需显式地编写它们。 - Dalmas
显示剩余2条评论
3个回答

6

如果您想

  • 不命名地写出所有属性
  • 以通用的方式将其用于任何Type

您可以编写一个快速的Reflection实用程序,如下所示

public static string GetAllProperties(object obj)
{
    return string.Join(" ", obj.GetType()
                                .GetProperties()
                                .Select(prop => prop.GetValue(obj)));
}

然后像这样使用

foreach (Galaxy theGalaxy in theGalaxies)
{
    Console.WriteLine(GetAllProperties(theGalaxy));
}

4
如果我理解正确,您想避免在循环内编写星系的各个属性?
在这种情况下,您可以适当地重载Galaxy上的ToString方法:
class Galaxy {
  public override string ToString() {
    return Name + "  " + MegaLightYearsl;
  }
}

那么你只需要执行以下操作:

foreach (var galaxy in theGalaxies) {
  Console.WriteLine(galaxy);
}

然而,由于您只有一个要重写的ToString,因此您无法为在不同上下文中可能需要的完全不同的字符串表示形式的对象执行此操作。


0

您的问题有点不清楚,但我猜您是在问如何通过索引而不是使用foreach循环来迭代列表。

尝试使用标准的for循环,像这样:

for(int i = 0; i < theGalaxies.Count; i++) {
    Console.WriteLine(theGalaxies[i].Name + "  " + theGalaxies[i].MegaLightYears);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接