0

辞書から入力したいフィールドとプロパティを持つタイプTがあり、大文字と小文字は区別されません。

私は明らかにすることができます

foreach(PropertyInfo pi in t.GetProperties() )
.....

その後

foreach(FieldInfo pi in t.GetFields() )
.....

おそらくLINQを使用して、より良い方法があることを願っていますか?

4

3 に答える 3

2

ここにオプションがあります、

var propDict = t.GetProperties().ToLookup<PropertyInfo, string, Action<object, object>>(
    p => p.Name, p => (obj, val) => p.SetValue(obj, val, null));

var fieldDict = t.GetFields().ToLookup<FieldInfo, string, Action<object, object>>(
    f => f.Name, f => (obj, val) => f.SetValue(obj, val));

var memberDict = pDict.Concat(fDict).ToDictionary(p => p.Key, p => p.Value);

...そして...のようなものを使用するには...

Dictionary<string, object> outDict;
foreach (var keyval in outDict)
    memberDict[keyval.Key](container, keyval.Value);

...とにかくプロパティ/フィールドを通過するのは比較的簡単なので、それがあまりにも理にかなっているのかどうかはわかりませんが、おそらくアイデアです。

于 2012-04-15T16:46:37.973 に答える
1

これ以上良いものはないと思います。PropertyInfoFieldInfoタイプには値を設定するための異なるAPIがあるため、値をに集めても、それらの値を均一に入力することはできませんIEnumerable<MemberInfo>

PropertyInfoさて、あなたは両方を処理FieldInfoし、異なるAPIをカプセル化する均一な方法でラッパーを書くことができます。しかし、とにかく2つforeachのループの方が簡単です。

于 2012-04-15T16:22:30.350 に答える
0

で何をする予定かによって異なりますpi

  • 新しいクラスに変換する場合は、

    t.GetProperties().Select(pi =>
    t.GetFields().Select(pi =>
    
  • プロパティを読み取って出力する場合、foreachループはLINQよりも優れています。

于 2012-04-15T16:17:22.423 に答える