2013-10-11 52 views
1

我想將數據庫結果轉換成類型屬性名稱,屬性值的字典。轉換列表<object>到詞典<propertyname,propertyvalue>

IEnumerable<image> results = Entity.GetAllContent<image>(); 

Dictionary<string, object> dict = 
      results.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public).ToDictionary(
       prop => prop.Name, prop => prop.GetValue(results, null)); 

行Entity.GetAllConent只是ormlite select的重載。通常這會返回多個對象(圖像)的通用列表。但是,當我嘗試執行上述代碼時,它就像試圖將列表或IEnumerable轉換爲字典,而不是轉換基本類型。

我得到以下異常:

Parameter count mismatch. 

    at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) 
    at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index) 
    at Web.Controllers.HomeController.<>c__DisplayClass3.b__1(PropertyInfo prop) in d:\projects\lovelife\Web\Controllers\HomeController.cs:line 33 
    at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) 
    at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector) 
    at Web.Controllers.HomeController.Test() in d:\projects\lovelife\Web\Controllers\HomeController.cs:line 31 
    at lambda_method(Closure , ControllerBase , Object[]) 
    at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.b__41() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.b__7(IAsyncResult _) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.b__33() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.b__49() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.b__36(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.b__20() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.b__22(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) 
    at System.Web.Mvc.Controller.<>c__DisplayClass1d.b__18(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.b__3(IAsyncResult ar) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.b__3(IAsyncResult ar) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) 
    at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.b__3(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.b__3(IAsyncResult ar) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

沒有提供內部異常。

+0

我會把錢放在來自GetValue方法調用的參數計數不匹配上。特別是在查看那個callstack之後。由'GetParameters'提供的一個參數可能是一個列表或其他索引參數,並且GetValue需要第二個參數爲非空以便正確引用它。 – Nevyn

+1

我試圖在這裏更好地理解你的最終目標:你是否試圖將IEnumerable/List的內容轉換爲字典? (字典將是類型<字符串,圖像>)....或者你是否試圖將Ienumerable的實際定義,而不是其內容,轉換成字典對象...意思是你需要定義的屬性收集,以便可以從該定義中重新構建,包括數據? – Nevyn

+0

然而,我認爲後者。我認爲如下,並且我懷疑。我如何嘗試是不可能的。這可能是我必須爲我的課程創建一個包裝,包含一個類型圖像列表,並將其作爲單個記錄傳遞。它的所有的DotLiquid的東西,但誰做了它做了一個小小的硬編碼教程,沒有給出很多線索 – davethecoder

回答

2

我不知道這將如何工作。您有一個相同類型的對象的列表(image)。每個人都會有相同的屬性(可能是Id,Name等)。你打算怎麼把它們放在一本字典裏?你會有每個重複的密鑰。您需要重寫它以創建一個詞典列表,每個元素爲1。

var dictionaries = results.Select(x => x.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public) 
          .ToDictionary(prop => prop.Name, prop => prop.GetValue(x, null))) 
          .ToList(); 
+0

其因爲我想使用dotliquid,但開發人員不回答任何事情,或提供真實世界的情況下。我必須通過字典<字符串,對象>,但液體模板代碼允許每個循環/。所以爲此我需要一個集合。我知道你在說什麼,這就是問題,因爲我想的是一樣的,沒有意義,他們想要一個同一類的多個實例的字典? – davethecoder

+0

你必須對他們想要的東西感到困惑。物理上不可能有一個具有相同鍵的字典。 –

+0

是特雷弗我的想法,只需要檢查它不是我失去了一些魔法伏都教或什麼。我認爲在這種情況下,我必須將List包裝到List 值的控制類中,然後將該包裝作爲一個請求發送。在液體中,我應該能夠遍歷classname.values,而不是classname – davethecoder

相關問題