正しいアプローチは、インターフェースを実装し(@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()
これで、任意のメソッドを呼び出して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
注:これは複雑なタイプのプロパティでは機能しません!