2017-07-13 117 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'和'values'的類型 –

+2

字典有什麼好處?有了它,你只需要使用'dict [「Name」]而不是'item.Name',所以我不會看到好處。如果你對字典的原因有不同的解決問題的方法可能會更好。 –

+0

它看起來像你想創建一個名單<字典>。當您嘗試從每個項目屬性中創建字典條目時。 – Heiner

回答

1

從你的例子中我看到你想要將每個列表項目映射到Dictionary。請嘗試下面的代碼:

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匹配屬性名稱要在一個項目,那麼你可以使用反射如下:

item.GetType().GetProperties().ToDictionary(x => x.Name, x => x.GetValue(item)); 

這個例子沒有通過CommonProperty濾波器,可結果在字典中的額外的條目,如果項目有什麼屬性,你不感興趣的

下面是完整的示例程序,它顯示目錄中的所有文件的屬性:

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#中都使用相同的語法進行讀寫,但反射的處理方式不同。上面的例子只顯示屬性。