2017-08-25 45 views
-1
var typeArgument = Type.GetType(mapping.TypeName); 
var method = _dbAccessor.GetType() 
          .GetMethod("GetViewData") 
          .MakeGenericMethod(new Type[] { typeArgument }); 
var viewData = method.Invoke(_dbAccessor, new object[] { mapping.SourceName }); 

GetViewData是通用方法。它通過mapping.SourceName獲得字符串數據,反序列化到列表typeArgument,並返回List<typeArgument>。數據有。但我知道viewDatatypeArgument類型的對象列表。 所以我怎麼可能投對象List<typeArgument>以允許foreach迭代var viewData將對象轉換爲通用列表,其中類型T取自變量

+0

你可以施放可視數據爲'System.Collections.IList'或'System.Collections.IEnumerable'。 – Lee

+0

你沒有直接訪問GetViewData?爲什麼你甚至使用反射? –

+1

而你的問題根本沒有意義。如果你使用反射你鬆散的類型定義,一切都是對象。現在鑄造沒有任何意義 –

回答

1

難道我理解正確嗎?變量viewData是一個對象,但您知道它是一個List<SomeTypeHere>

嗯,你可以通過它投你viewDataIEnumerable循環。但你不能做什麼好它,因爲你不知道的對象類型:

foreach (object item in (viewData as IEnumerable)) 
{ 
} 

但是,如果你知道的項目類型,則可以使用擴展方法OfType()

var castedObjects = (viewData as IEnumerable).OfType<SomeTypeHere>(); 
foreach (SomeTypeHere item in castedObjects) 
{ 
} 

確保包括LINQ的命名空間:using System.Linq

+0

現在這個問題已經被編輯了,第一個'foreach'顯示了一個可行的解決方案。然而,第二個循環是不可能的,因爲OP沒有訪問'SomeTypeHere'類型。 – dasblinkenlight

1

您將無法使用由Invoke方法在一個強類型的方式返回的列表,如果這就是你想要的。

鑄造到IEnumerable是您最好的選擇,如果你只是希望能夠疊代:

var viewData = method.Invoke(_dbAccessor, new object[] { mapping.SourceName }) as IEnumerable; 
if(viewData != null) 
    foreach (var data in viewData) 
    { 
     ... 
    } 

如果你想添加一些你可以轉換爲IList列表。

請參考下面的博客文章以瞭解更多信息。

泛型類型參數和動態類型在C#:https://blog.magnusmontin.net/2014/10/31/generic-type-parameters-and-dynamic-types-in-csharp/