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


Answers:


457

是。

(T)Activator.CreateInstance(typeof(T), param1, param2);

2
我喜欢这个答案;-)
frhack

16

还有另一种通过命名参数将参数传递给CreateInstance的方法。

基于此,您可以将数组传递给CreateInstance。这将使您拥有0个或多个参数。

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

2
这似乎是不完整的,您肯定需要返回T类型的对象而不是void吗?公共T CreateInstance <T>(params object [] paramArray){return(T)Activator.CreateInstance(typeof(T),args:paramArray); }
wlf

11

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

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

有关此问题的详细信息。

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

性能比较


就上下文而言,该图表意味着(平均而言,在同一硬件上)每次调用参数化构造函数Activator.CreateInstance都将花费0.0035ms(或3.5微秒)-根据您的应用程序,这甚至可能根本不会在性能测试中进行注册。

6

作为Activator.CreateInstance的替代方法,链接的URL中的FastObjectFactory的性能优于Activator(从.NET 4.0开始,并且比.NET 3.5更好。在.NET 4.5中未进行任何测试/统计)。有关统计信息,信息和代码,请参见StackOverflow帖子:

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


您是说有一个替代解决方案(链接的)在传递参数时可能比Activator.CreateInstance更好。还是在所有情况下都可能表现更好?
El Zorko

1
我已经有一段时间没有进行性能测试了,看起来好像有人发布了.NET 4.0统计信息,但是是的。对于.NET 4.0,它看起来像FastObjectFactory具有更好的性能。Activator.CreateInstance在.NET 3.5中非常糟糕,在.NET 4.0中明显更快,但是仍然比该URL中链接的FastObjectFactory慢。
泰晤士河,2014年

1
public class AssemblyLoader<T>  where T:class
{
    public void(){
        var res = Load(@"C:\test\paquete.uno.dos.test.dll", "paquete.uno.dos.clasetest.dll") 
    }

    public T Load(string assemblyFile, string objectToInstantiate) 
    {
        var loaded = Activator.CreateInstanceFrom(assemblyFile, objectToInstantiate).Unwrap();

        return loaded as T;
    }
}

1
这是无法解释的仅代码。我怀疑它是否有帮助甚至根本没有作用。为了使我信服,请解释一下它是如何工作的以及为什么应该解决这个问题。
Yunnosch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.