在C#中是否有一种类似以下方法的方式:
public void Foo<T>()
{
T[] arr = Goo() as T[];
}
Goo返回一个object[]
,使用反射或其他方法?
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;
}
然而,这样做的一个烦恼是我们现在有了不同的语义 - 在某些情况下它是相同的数组,在某些情况下它是复制的。如果我们改变数组,这可能会带来问题。
void
,但是你返回了一个数组?返回类型不应该是T[]
吗? - Noctis
object[]
永远不可能是一个T[]
。但是一个object
可以是。 - Damien_The_Unbelieverobject[] a = new T[]
将是有效的(where T:class
),而不是反过来。 - Damien_The_Unbelieverobject[]
实际上是什么 ;p 由于T[]
可以表示为object[]
,因此您的object[]
可能实际上是T[]
。但是,如果数组是作为object[]
构造的,但恰好包含所有T
,那么确实:转换将失败。 - Marc Gravell