ビジネスオブジェクトを反復処理し、その内容をログファイルにダンプするコードを記述しようとしています。
そのために、すべてのパブリックプロパティを検索し、リフレクションを使用してそれらの名前と値を出力できるようにしたいです。また、コレクションプロパティを検出し、それらを反復処理できるようにしたいと思います。
このような2つのクラスを想定します。
public class Person
{
private List<Address> _addresses = new List<Address>();
public string Firstname { get; set; }
public string Lastname { get; set; }
public List<Address> Addresses
{
get { return _addresses; }
}
}
public class Address
{
public string Street { get; set; }
public string ZipCode { get; set; }
public string City { get; set; }
}
私は現在、すべてのパブリックプロパティを見つける次のようなコードを持っています:
public void Process(object businessObject)
{
// fetch info about all public properties
List<PropertyInfo> propInfoList = new List<PropertyInfo>(businessObject.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public));
foreach (PropertyInfo info in propInfoList)
{
// how can I detect here that "Addresses" is a collection of "Address" items
// and then iterate over those values as a "list of subentities" here?
Console.WriteLine("Name '{0}'; Value '{1}'", info.Name, info.GetValue(businessObject, null));
}
}
しかし、特定のプロパティ(クラスなど)がオブジェクトのコレクションでAddresses
あることを検出する方法を理解できませんか?プロパティ(または私が探している情報を私に与えるようなもの)を見つけることができないようですPerson
Address
propInfo.PropertyType.IsCollectionType
私は(失敗して)次のようなことを試しました:
info.PropertyType.IsSubclassOf(typeof(IEnumerable))
info.PropertyType.IsSubclassOf(typeof(System.Collections.Generic.List<>))
info.PropertyType.IsAssignableFrom(typeof(IEnumerable))