正确的方法是实现一个接口(正如@Adarsha 所说)并在每个类中实现 RenderOutput() 方法,以使其具有自己的特定实现,并具有正确的属性列表、正确的格式等。
现在,如果你仍然想坚持你的方法,这将是可行的。
假设这些是您的课程
public class Car
{
public string Brand { get; set; }
public int HorsePower { get; set; }
public int TopSpeed { get; set; }
}
public class Driver
{
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
}
现在,这些方法将使用反射来读取属性并将它们写入控制台。
public static void RenderOutput(IEnumerable<object> collection)
{
RenderHeader(collection.First()); //collection not validated
collection.ToList().ForEach(item => RenderBody(item));
}
private static void RenderHeader(object obj)
{
var properties = obj.GetType().GetProperties().OrderBy(p => p.Name);
Console.WriteLine("");
foreach (var prop in properties)
{
Console.Write(prop.Name + "\t"); //or ("{0,15}", prop.Name)
}
}
private static void RenderBody(object obj)
{
var properties = obj.GetType().GetProperties().OrderBy(p => p.Name);
Console.WriteLine("");
foreach (var prop in properties)
{
Console.Write((prop.GetValue(obj, null)) + "\t"); //or ("{0,15}", (prop.GetValue(obj, null)))
}
}
您现在可以RenderOutput()
在 any 上调用该方法IEnumerable<T>
以获得所需的输出。你可以像这样测试它
static void Main(string[] args)
{
//test data
var cars = new List<Car>();
cars.Add(new Car { Brand = "BMW", HorsePower = 100, TopSpeed = 200 });
cars.Add(new Car { Brand = "VW", HorsePower = 90, TopSpeed = 150 });
var drivers = new List<Driver>();
drivers.Add(new Driver { Name = "Prit", Age = 18, Sex = "Male" });
drivers.Add(new Driver { Name = "Jane", Age = 20, Sex = "Female" });
RenderOutput(cars);
Console.WriteLine();
RenderOutput(drivers);
Console.ReadLine();
}
这是生成的输出:
Brand HorsePower TopSpeed
BMW 100 200
VW 90 150
Age Name Sex
18 Prit Male
20 Jane Female
注意:这不适用于复杂类型的属性!