iT邦幫忙

0

如何把object[]強制轉型成普通的class[]

想問一下在不把傳回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 ;
 }
object.AsEnumerable()
fillano iT邦超人 1 級 ‧ 2020-12-11 16:07:27 檢舉
用List<Item>取代Item[]啦
gaia2222 iT邦新手 5 級 ‧ 2020-12-11 16:55:42 檢舉
非常感謝你的建議>"<可是他說無法張List<object>轉成List<Item>,無法強制轉型itemList = (List<Item>)CrateItemList();

2 個回答

0
通靈亡
iT邦研究生 3 級 ‧ 2020-12-11 17:07:13

使用 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

gaia2222 iT邦新手 5 級 ‧ 2020-12-11 17:19:36 檢舉

成功了QQ感謝大大,原因是因為object[]不能強制轉型麼?

通靈亡 iT邦研究生 3 級 ‧ 2020-12-11 17:32:51 檢舉

你可以讀一下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

1
石頭
iT邦研究生 2 級 ‧ 2020-12-11 17:08:36

如果是要重複建立物件 我會使用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

gaia2222 iT邦新手 5 級 ‧ 2020-12-11 17:22:35 檢舉

好的~感謝大大~>"< Enumerable比強制轉型更安全?

石頭 iT邦研究生 2 級 ‧ 2020-12-12 17:56:53 檢舉

Enumerable.Repeat他是可以重複建立n個物件,我覺得重點在為何需要強制轉型,一般來說會盡量避免強制轉型

我要發表回答

立即登入回答