辞書から入力したいフィールドとプロパティを持つタイプTがあり、大文字と小文字は区別されません。
私は明らかにすることができます
foreach(PropertyInfo pi in t.GetProperties() )
.....
その後
foreach(FieldInfo pi in t.GetFields() )
.....
おそらくLINQを使用して、より良い方法があることを願っていますか?
辞書から入力したいフィールドとプロパティを持つタイプTがあり、大文字と小文字は区別されません。
私は明らかにすることができます
foreach(PropertyInfo pi in t.GetProperties() )
.....
その後
foreach(FieldInfo pi in t.GetFields() )
.....
おそらくLINQを使用して、より良い方法があることを願っていますか?
ここにオプションがあります、
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);
...とにかくプロパティ/フィールドを通過するのは比較的簡単なので、それがあまりにも理にかなっているのかどうかはわかりませんが、おそらくアイデアです。
これ以上良いものはないと思います。PropertyInfo
とFieldInfo
タイプには値を設定するための異なるAPIがあるため、値をに集めても、それらの値を均一に入力することはできませんIEnumerable<MemberInfo>
。
PropertyInfo
さて、あなたは両方を処理FieldInfo
し、異なるAPIをカプセル化する均一な方法でラッパーを書くことができます。しかし、とにかく2つforeach
のループの方が簡単です。
で何をする予定かによって異なりますpi
。
新しいクラスに変換する場合は、
t.GetProperties().Select(pi =>
t.GetFields().Select(pi =>
プロパティを読み取って出力する場合、foreach
ループはLINQよりも優れています。