2

ビジネスオブジェクトを反復処理し、その内容をログファイルにダンプするコードを記述しようとしています。

そのために、すべてのパブリックプロパティを検索し、リフレクションを使用してそれらの名前と値を出力できるようにしたいです。また、コレクションプロパティを検出し、それらを反復処理できるようにしたいと思います。

このような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あることを検出する方法を理解できませんか?プロパティ(または私が探している情報を私に与えるようなもの)を見つけることができないようですPersonAddresspropInfo.PropertyType.IsCollectionType

私は(失敗して)次のようなことを試しました:

info.PropertyType.IsSubclassOf(typeof(IEnumerable))
info.PropertyType.IsSubclassOf(typeof(System.Collections.Generic.List<>))

info.PropertyType.IsAssignableFrom(typeof(IEnumerable))
4

2 に答える 2

4

IEnumerable配列であっても、すべてのコレクションによって実装されているものを確認するだけです。

var isCollection = info.PropertyType.GetInterfaces()
                       .Any(x => x == typeof(IEnumerable));

このインターフェイスを実装するクラスに特別なケース処理を追加することもできますが、それでもコレクションのように扱うべきではないことに注意してください。stringそのような場合になります。

于 2013-03-22T13:38:09.860 に答える
0

文字列などの煩わしさを避けたい場合:

    var isCollection = info.PropertyType.IsClass && 
info.PropertyType.GetInterfaces().Contains(typeof(IEnumerable));
于 2020-11-13T06:27:17.937 に答える