[英]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.