我在用着Activator.CreateInstance
通过类型变量创建对象(在运行时未知):
static dynamic CreateFoo( Type t ) =>
Activator.CreateInstance( t );
显然,我还没有正确理解如何使用dynamic
类型,因为这仍然只是返回一个对象。
我需要能够将集合传递给另一个调用Activator.CreateInstance
其中正在创建的类型可以是List<T>
:
var values = Enumerable.Range( 1, 50 ).Select(
I => CreateFoo( typeof( Foo ) ) ).ToArray( );
//This will explode.
var foobar = Activator.CreateInstance(
typeof( List<Foo> ), values );
当调用上面的方法时,它会爆炸并出现以下异常:
我明白为什么要这样做 - 当使用类型参数定义列表时,没有期望可枚举对象的列表的构造函数。
问题是我无法转换对象,因为我不知道运行时的类型。Activator.CreateInstance
似乎只返回一个对象,这对于List<Foo>
因为我将使用依赖项对象和属性来设置它们,所以装箱对象非常适合它们,但在尝试创建列表时会破坏所有内容(并且可能会破坏任何带有需要类型参数的构造函数的其他内容)。
我在这里想要完成的事情的正确方法是什么?
符合最小、完整且可验证的示例 https://stackoverflow.com/help/mcve要求:
using System;
using System.Collections.Generic;
using System.Linq;
namespace MCVEConsole {
class Program {
static int Main( string[ ] args ) {
var values = Enumerable.Range( 1, 50 ).Select(
I => CreateFoo( typeof( Foo ) ) ).ToArray( );
//This will compile, but explode when run.
var foobar = Activator.CreateInstance(
typeof( List<Foo> ), values );
return 1;
}
static dynamic CreateFoo( Type t ) =>
Activator.CreateInstance( t );
}
class Foo {
public Foo( ) { }
}
}