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>
。
viewData的类型为object
。但我知道viewData
是typeArgument
类型的对象列表。
那么我怎样才能将对象转换为List<typeArgument>
以允许foreach
为var viewData
进行迭代?
答案 0 :(得分:1)
我做对了吗?变量viewData
是一个对象,但您知道它是List<SomeTypeHere>
?
好吧,您可以将viewData
转换为IEnumerable
以循环播放它。但是你不能用它做任何好事,因为你不知道对象的类型:
foreach (object item in (viewData as IEnumerable))
{
}
但是,如果您知道这些项目&#39;类型,您可以使用扩展方法OfType()
:
var castedObjects = (viewData as IEnumerable).OfType<SomeTypeHere>();
foreach (SomeTypeHere item in castedObjects )
{
}
确保包含Linq名称空间:using System.Linq
答案 1 :(得分:1)
如果符合您的要求,您将无法以强类型方式使用IEnumerable
方法返回的列表。
如果您只是希望能够迭代它,那么转换为var viewData = method.Invoke(_dbAccessor, new object[] { mapping.SourceName }) as IEnumerable;
if(viewData != null)
foreach (var data in viewData)
{
...
}
是您的最佳选择:
IList
如果您想在列表中添加内容,可以转换为{{1}}。
有关详细信息,请参阅以下博文。
C#中的通用类型参数和动态类型: https://blog.magnusmontin.net/2014/10/31/generic-type-parameters-and-dynamic-types-in-csharp/