将类型化的Ilist(接口)类型转换为类型化数组

时间:2015-02-17 13:13:46

标签: c# arrays list

我目前有一个正在构建的IList:

var baseType = typeof(List<>);
Type genericType = baseType.MakeGenericType(prop.PropertyType.GetGenericArguments().First());
IList returnedvalues = (IList)Activator.CreateInstance(genericType);

prop指的是Object的属性。例如

public List<String> PersonNames{get; set;}

public List<SomeSelfCreatedObject> MyObjects{get; set;}

现在客户要我return this Ilist as an Array。我知道如何将其作为Object[] or any other predefined type(like Int,String)返回。但是可以返回上面代码中定义的类型的数组吗?

所以我会得到以下输出(演员后)

public List<SomeSelfCreatedObject> MyObjects{get; set;} 
             Would result in => SomeSelfCreatedObject[]
public List<String> PersonNames{get; set;} 
             Would result in => String[]

2 个答案:

答案 0 :(得分:3)

Activator.CreateInstance(genericType)返回的类型属于List<T>,其中T在编译时未知。这使得铸造变得棘手。我们可以在此处使用dynamic并直接调用Enumerable.ToArray()以获取T[]的值。

dynamic returnedvalues = Activator.CreateInstance(genericType);
dynamic valuesAsArray = Enumerable.ToArray(returnedvalues);

我们仍然无法在编译时知道valuesAsArray的类型,这使得使用起来很棘手,但我不知道这对您是否有问题。这取决于你接下来想做什么......

正如Sriram Sakthivel在评论中指出的那样,你可以将值AsArray转换为非动态的东西。它永远不会是泛型类型,因为您不知道编译时类型,但您可以转换为数组或任何其他数量的东西(有关您可以将其投射到的其他信息,请参阅What interfaces do all arrays implement in C#?)。 / p>

答案 1 :(得分:2)

除非我误解了您的问题,否则您只能在列表上调用ToArray()方法吗?