C# 在运行时创建泛型数组

C# 在运行时创建泛型数组,c#,generics,reflection,C#,Generics,Reflection,在c#中有没有这样的方法: Foo<string>(); public void Foo() { T[]arr=Goo()作为T[]; } 其中Goo使用反射或其他方法返回一个对象[]。您可以使用LINQ: public void Foo<T>() { T[] arr = Goo().OfType<T>().ToArray(); } 例如,这将在以下情况下起作用: public object[] Goo() { return new st

在c#中有没有这样的方法:

Foo<string>();
public void Foo()
{
T[]arr=Goo()作为T[];
}
其中Goo使用反射或其他方法返回一个
对象[]

您可以使用LINQ:

public void Foo<T>()
{
    T[] arr = Goo().OfType<T>().ToArray();
}
例如,这将在以下情况下起作用:

public object[] Goo()
{
    return new string[] { "a", "b" };
}
然后像这样称呼Foo:

Foo<string>();
Foo();

也许最简单、最可靠的方法是复制阵列,逐项执行强制转换:

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

不过,其中一个麻烦是,我们现在有了不同的语义——在某些情况下,它是同一个数组,在某些情况下,它是复制的。如果我们改变数组,这可能会有问题。

我认为
对象[]
永远不会是
t[]
。一个
对象
可能是这样的。@Damien\u不信者:@Ani-我可能误读了这一点,但它似乎说
object[]a=newt[]
将是有效的(
其中T:class
),而不是相反。@Damien\u不信者它取决于
对象[]
的实际情况;p由于
T[]
可以表示为
对象[]
,因此您的
对象[]
可能实际上是
T[]
。但是,如果数组被构造为
对象[]
,但恰好包含所有
T
,那么实际上:强制转换将失败。嗯。。。签名中有
void
,但返回了数组?它不应该有一个
t[]
作为返回类型吗?@Nocitus-yup;在“电话:”上编码的危险
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;
}