2017-07-13 6 views
0

私は設計していないアプリでこのように設計していないでしょう。 Dictionary<string, object>にマップしたいリストがあります。以下のような結果の辞書にはなります。カスタムリストへのマップリスト

var dictionary = new Dictionary<string, object>{ 
{ CommonProperty.Name, item.Name }, 
{ CommonProperty.UriAddr, item.UriAddr}   
//other properties      
} 

CommonPropertyは、静的プロパティを持つ密封されたクラスであるNameUriAddrなど私が試した何かのように、たとえば: - 私は以下のLINQクエリを活用しようとして捕まってしまった

var dict = myList.Select((h, i) => new { key = h, index = i }) 
.ToDictionary(o => o.key, o => values[o.index])); 

そして...

foreach(var item in list){ 
var _dict = new Dictionary<string, object>{ 
{CommonProperty.Name, item.Name}, 
//other properties 
    } 
} 

CommonPropertyは、プロパティに追加情報を追加するため呼び出す必要があります。キーと値の両方が同じ「名前」です。

私の質問は:myListをマップし、上記のような辞書を返すにはどうすればよいですか?より良い方法がありますか?

ありがとうございます。

+2

あなたも ''はmyListの種類を示したhaventと 'values' –

+2

辞書の利点は何ですか?それで 'item.Name'の代わりに' dict ["Name"] 'だけでよいので、私は利益を見ません。あなたが辞書の理由を広告するなら、問題を解決する別の方法が良いかもしれません。 –

+0

List >を作成するようです。あなたは各項目のプロパティから辞書のエントリを作成しようとします。 – Heiner

答えて

1

あなたの例から、リストの各項目を辞書にマップしたいと思うことが分かります。このコードを試してください:

var commonProps = typeof(CommonProperty).GetProperties(BindingFlags.Static | BindingFlags.Public); 
var itemProps = list.GetType().GenericTypeArguments[0].GetProperties().ToDictionary(k => k.Name, v => v); 

var result = list.Select(l => commonProps.ToDictionary(
    k => k.GetValue(null), 
    v => itemProps[v.Name].GetValue(l) 
)); 
1

「キーと値の両方が同じ名前である」という正確な意味は?あなたが項目にdicrionaryマッチプロパティ名にしたいキー場合は、次のように、あなたは、リフレクションを使用することができます。

この例では、CommonPropertyによってフィルタリングしない
item.GetType().GetProperties().ToDictionary(x => x.Name, x => x.GetValue(item)); 

いることができ辞書に余分なエントリにおける結果の項目は任意の性質を持っている場合。に興味を持っていません

次は、ディレクトリ内のすべてのファイルのプロパティを表示し、完全なプログラム例です:

static class Program 
{ 
    static Dictionary<string, object> ObjToDic(object o) 
    { 
     return o.GetType().GetProperties().ToDictionary(x => x.Name, x => x.GetValue(o)); 
    } 

    static void Main(string[] args) 
    { 
     var fileNames = Directory.EnumerateFiles("c:\\windows"); 

     foreach (string name in fileNames) 
     { 
      Console.WriteLine("=========================================="); 
      FileInfo fi = new FileInfo(name); 
      var propDict = ObjToDic(fi); // <== Here we convert FileInfo to dictionary 
      foreach (var item in propDict.AsEnumerable()) 
      { 
       Console.WriteLine(string.Format("{0}: {1}", item.Key, item.Value.ToString())); 
      } 
     } 
    } 
} 

クマを念頭に、.NETのプロパティとフィールドがあること。どちらもC#で同じ構文を使用して読み書きされますが、反射ではそれらの処理が異なります。上記の例では、プロパティのみが表示されています。

関連する問題