将对象转换为通用列表,其中类型T取自变量

时间:2017-08-25 14:36:38

标签: c# generics reflection casting

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。但我知道viewDatatypeArgument类型的对象列表。 那么我怎样才能将对象转换为List<typeArgument>以允许foreachvar viewData进行迭代?

2 个答案:

答案 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/