簡體   English   中英

在運行時創建通用數組

[英]Creating a generic array at runtime

C#中有沒有一種方法可以執行以下操作:

public void Foo<T>()
{
    T[] arr = Goo() as T[];
}

Goo在哪里返回object[] ,使用反射還是其他方法?

您可以使用LINQ:

public void Foo<T>()
{
    T[] arr = Goo().OfType<T>().ToArray();
}

在您的示例中,您將object[]強制轉換為T[] ,如果兩種類型完全匹配,也可以使用:

public void Foo<T>()
{
    T[] arr = Goo() as T[];
    if (arr != null)
    {
        // use the array
    }
}

例如,這將在以下情況下起作用:

public object[] Goo()
{
    return new string[] { "a", "b" };
}

然后像這樣調用Foo:

Foo<string>();

也許最簡單,最可靠的方法是復制數組,逐項進行轉換:

public void Foo<T>()
{
    T[] arr = Array.ConvertAll(Goo(), x => (T)x);
}

這是一個“ unbox.any ”,對JIT意味着:

  • 如果T證明是引用類型,則進行一個castclass (即引用保留類型檢查)
  • 如果T成為值類型,則取消unbox

引用類型的數組是協變的 ,這意味着T[]可以表示object[] 正因為如此,有機會的結果Goo()實際上 T[] 我們可能還想測試一下:

public T[] Foo<T>()
{
    var tmp = Goo();
    T[] arr = tmp as T[];
    if(arr == null && tmp != null) {
        arr = Array.ConvertAll(Goo(), x => (T)x);
    }
    return arr;
}

令人煩惱的是,我們現在具有不同的語義-在某些情況下,它是同一數組,在某些情況下,它是被復制的。 如果我們對數組進行突變 ,則可能會出現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM