想問一下在不把傳回object[]變成Item[]的情況下,要如何把object[]變回原來的class>"<?
因為試過在在沒有array的情況下是成功傳回加上轉型的,一旦加上array,就會出現 invalidcastexception specified cast is not valid,應該是不能把object[]轉型成Item[] @@,求解決方法>"<感謝各位大大
C#
public Item[] itemList;
private void Start()
{
itemList = (Item[])CrateItemList();
}
public object[] CrateItemList()
{
object[] returnItemList = new object[5];
for (int i = 0; i < 5; i++)
returnItemList [i] = new Item();
return returnItemList ;
}
使用 Array.ConvertAll<轉換前的型別, 轉換後的型別>(要轉換的陣列, 轉換的程式處理方法);
Item[] items = Array.ConvertAll<object, Item>(objArray, x => (Item)x);
範例:
https://dotnetfiddle.net/fTioSu
using System;
class Item
{
private string property;
public Item (string property)
{
this.property = property;
}
public string someMethod ()
{
return property;
}
}
public class Program
{
public static void Main()
{
object[] objArray = {new Item("01"), new Item("02")};
Item[] items = Array.ConvertAll<object, Item>(objArray, x => (Item)x);
foreach(Item item in items)
{
Console.WriteLine(item.someMethod());
}
}
}
https://stackoverflow.com/questions/15318946/converting-a-object-array-to-an-string-array-in-c
成功了QQ感謝大大,原因是因為object[]不能強制轉型麼?
你可以讀一下Array.ConvertAll的原始碼,不是你想像中的直接轉這麼單純
public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] array, Converter<TInput,TOutput> converter) {
if( array == null) {
throw new ArgumentNullException("array");
}
if( converter == null) {
throw new ArgumentNullException("converter");
}
Contract.Ensures(Contract.Result<TOutput[]>() != null);
Contract.Ensures(Contract.Result<TOutput[]>().Length == array.Length);
Contract.EndContractBlock();
TOutput[] newArray = new TOutput[array.Length];
for( int i = 0; i< array.Length; i++) {
newArray[i] = converter(array[i]);
}
return newArray;
}
https://referencesource.microsoft.com/#mscorlib/system/array.cs,f4af030bcf8c8991
如果是要重複建立物件 我會使用Enumerable.Repeat
去完成
public Item[] itemList;
private void Start()
{
itemList = CrateItemList();
}
public Item[] CrateItemList()
{
return Enumerable.Repeat(new Item(), 5).ToArray();
}
Note: 如果針對集合要轉型可以使用Enumerable.Cast
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.cast?view=net-5.0