如何将参数传递给Activator.CreateInstance <T>()

Dav*_*Dev 216 c# generics createinstance

我想创建一个我在一个通用方法中指定的类型的实例.此类型具有许多重载的构造函数.我希望能够将参数传递给构造函数,但是

Activator.CreateInstance<T>()
Run Code Online (Sandbox Code Playgroud)

并不认为这是一个选择.

还有另一种方法吗?

SLa*_*aks 425

是.

(T)Activator.CreateInstance(typeof(T), param1, param2);
Run Code Online (Sandbox Code Playgroud)


sud*_*u63 15

还有另一种方法可以通过命名参数将参数传递给CreateInstance.

基于此,您可以将数组传递给CreateInstance.这将允许您有0个或多个参数.

public T CreateInstance<T>(params object[] paramArray)
{
  return (T)Activator.CreateInstance(typeof(T), args:paramArray);
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不完整,你肯定需要返回一个T类型的对象而不是void?public T CreateInstance <T>(params object [] paramArray){return(T)Activator.CreateInstance(typeof(T),args:paramArray); } (2认同)

Ane*_*lou 9

请记住,尽管在Activator.CreateInstance上传递参数与无参数创建相比在性能上有显着差异。

有更好的替代方法,可以使用预编译的lambda动态创建对象。当然,性能总是主观的,并且显然取决于每种情况是否值得。

有关此问题的详细信息。

该图取自本文,表示每1000个呼叫所花费的时间(以毫秒为单位)。

性能比较

  • 对于上下文,此图表意味着(平均而言,在相同的硬件上)每次使用“Activator.CreateInstance”调用参数化构造函数将花费“0.0035ms”(或 3.5 微秒) - 根据您的应用程序,这甚至可能不会注册根本没有性能测试。 (6认同)

tha*_*mes 6

作为Activator.CreateInstance的替代方案,链接url中的FastObjectFactory比Activator更好(从.NET 4.0开始,明显优于.NET 3.5.没有使用.NET 4.5进行测试/统计).有关统计信息,信息和代码,请参阅StackOverflow帖子:

如何在Activator.CreateInstance中传递ctor args或使用IL?