C# 在运行时创建泛型数组
在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
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;
}