2016-08-04 92 views
0

我正在使用反射來獲取列表並嘗試將它傳遞到接收List的委託。類型「object {System.Collections.Generic.List <T>}」VS「System.Collections.Generic.List <T>」

然而,當我使用反射我的列表的類型是:

object {System.Collections.Generic.List<T>} 

當我把它傳遞給委託(泛型)我得到一個例外,因爲它期待的類型:

System.Collections.Generic.List<T> 

只是爲了確認這個問題,我直接轉到了List<RealTClass>並且工作。但是,在我的代碼中,我不想做這種不必要的轉換......也因爲我正在使用泛型。

問題1:爲什麼反射返回的對象類型爲:object { X }

問題#2:如何從類型中「刪除」object { X }部分?基本上,我需要解決這個問題....

謝謝。

更新#1:一些代碼...

//METHOD receives 'obj' and 'includes' 
T obj 
Expression<Func<T, object[]>> includes = null 
... 
if (res && includes != null) 
{ 
    var array = includes.Body as NewArrayExpression; 
    if (array != null) 
    { 
     var exps = ((IEnumerable<object>)array.Expressions).ToArray();   
     for (var i = 0; i < exps.Length; i++) 
     { 
      var tartetListProperty = (exps[i] as MemberExpression).Member as PropertyInfo; 
      var navigationPropertyForList = tartetListProperty.GetCustomAttributes(typeof(NavigationPropertyForList)) as NavigationPropertyForList[]; 
      if (navigationPropertyForList == null || navigationPropertyForList.Length == 0) continue; 
      var navigationPropertyForListString = navigationPropertyForList[0].TargetPropertyName; 
      if (tartetListProperty == null) continue; 
      var list = tartetListProperty.GetValue(obj); // WHERE I USE REFLECTION TO GET THE LIST 
      var listOfType = list.GetType().GetGenericArguments()[0]; 

      var repDNI = uow.GetRepositoryDeleteNotIncludedAsyncByType(listOfType); 
      await repDNI(list, navigationPropertyForListString, obj.Id); // THIS IS WHERE IT FAILS 

      if (!res) break; 
     } 
    } 
} 

repDNI對象是正確的工作,如果我做了正確的鑄造,我遇到的唯一問題是獲得list,類型object { X }正在圍繞我的正確類型。

+0

[拳擊](https://msdn.microsoft.com/en-我們/庫/ yz2be5wk.aspx)。 – Sinatr

+1

你有異常還是編譯錯誤?你可以添加你使用的代碼嗎? – Lee

+0

@Lee運行時異常 – Dryadwoods

回答

0

我能夠使其通過更改以下行的工作:

前:var list = tartetListProperty.GetValue(obj);

後:dynamic list = tartetListProperty.GetValue(obj);

-1

你可以轉換爲泛型列表:

await repDNI((List<T>)list, navigationPropertyForListString, obj.Id); 

據我所知,而其餘的一般功能,這應該解決您的問題。

+0

我在我的問題上寫道,爲了確認我做了你現在寫的東西,但這不是一個答案,因爲列表中的TK(並且它可以是多個列表,因爲我在變量上包含循環)不是一種已知的類型。 – Dryadwoods

+0

我想你誤解了我。您對原始類型進行了強制轉換,我對T進行了強制轉換。這樣可以解決您的問題,同時保持泛型類型的靈活性。 –

+0

我明白,你正試圖幫助,買你沒有閱讀我的源代碼:我正在與一個基於變量「includes」的列表,我循環他們和動態我得到相應的列表,類型T是不知道,並且每個「包含」元素不同。正如你從代碼中看到的那樣,我正在使用表達式樹/反射/等......來處理這些信息......唯一已知類型「T」應用於變量「obj」。 – Dryadwoods

相關問題