1

クラス:

public class Person
{
    public string Title;
    public string Name;
    public Int32 Age;
}

文字列のリストがあります

List<String> fields = new List<String>()
{
    "Title",
    "Age"
};

上記の文字列のリストを考慮して、Person オブジェクトのリストを反復処理しながら、リストされたフィールドを WriteLine したいと思います。

var persons = new List<Person>();

//Populate persons

foreach(Person person in persons)
{
    //Print out Title and Age of every person (because Title and Age are listed in fields)
}

私が試したこと:

  • 私が試したことは機能しますが、非常に非効率的です。For every iterationを作成しDictionary<String, object>、オブジェクトのすべてのフィールドをディクショナリのエントリに割り当ててから、キーをリスト内の項目に一致させることによってのみディクショナリ エントリを評価しますfields
4

1 に答える 1

2

奇妙な要件です。たとえば、非効率的なリフレクションが必要です。

IEnumerable<PropertyInfo> properties = typeof(Person)
            .GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .Where(p => fields.Contains(p.Name));

foreach (Person person in persons)
{
    foreach (PropertyInfo prop in properties)
        Console.WriteLine("{0}: {1}", prop.Name, prop.GetValue(person, null));
}

デモ

プロパティではなくフィールドを探している可能性が高いことがわかりました。次に、次の同様のコードを使用します。

IEnumerable<FieldInfo> fields = typeof(Person)
    .GetFields( BindingFlags.Public | BindingFlags.Instance)
    .Where(f => fieldNames.Contains(f.Name)); // fieldNames is your List<string>

foreach (Person person in persons)
{
    foreach (FieldInfo field in fields)
        Console.WriteLine("{0}: {1}", field.Name, field.GetValue(person));
}
于 2012-11-20T14:10:33.147 に答える